a={id:1,get:function(){alert(this.id)}}
$("#test").click(a.get)//這時候所指的id就不是1,而是test
如果想要得到的是1,那就必須改變上下文環境$.
$.proxy()的作用就是改變當前上下文環境。
$("#test").click($.proxy(a,"get"))
$("#test").click($.proxy(a.get,a))
proxy: function( fn, context ) {//改變函數上下文環境,this指向設置的對象
這裡的參數可以有兩種方式:函數fn fn的方法context
函數的方法fn[context] 函數fn
if ( typeof context === "string" ) {//如果content是字符串,那麼會認為是fn的一個方法 fn[ context ],並在接下來判斷是否是函數
var tmp = fn[ context ];
context = fn;
fn = tmp;
}
if ( !jQuery.isFunction( fn ) ) {//不是函數立刻返回undefined
return undefined;
}
var args = slice.call( arguments, 2 ),//把fn,content後面的參數作為要執行的函數參數
proxy = function() {
return fn.apply( context, args.concat( slice.call( arguments ) ) );//返回設置了指定上下文環境的可執行函數,fn為可執行行數,把this指向content,args.concat( slice.call( arguments ) )作為參數,
};
proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;//一個全局的計數器,用於標識該函數可以用來刪除
return proxy;
},
//access這個方法主要是在jquery內部使用,用於attr,prop,css;主要設置DOM組(jquery對象)單個或者多個屬性、樣式的值,獲取DOM組(jquery對象)某個屬性、樣式的值
//elems操作的對象組,key屬性,value屬性值,exec默認true,fn用來操作的函數,pass主要在attr的時候設置val,css,html,text,data,width,height,offset的時候應該為true.
access: function( elems, key, value, exec, fn, pass ) {
var length = elems.length;
//設置多個屬性
if ( typeof key === "object" ) {//如果屬性值是對象,將循環設置dom組(jquery對象)的屬性和對應的值
for ( var k in key ) {
jQuery.access( elems, k, key[k], exec, fn, value );
}
return elems;//返回結果
}
// 設置單個屬性
if ( value !== undefined ) {//如果value存在,設置某個屬性,可以是一組對象或者單個;如果不存在,即獲取doms[0](jquery對象)某個屬性值,只能返回帶一個對象,或者由於對象不存在直接返回undefiend;
exec = !pass && exec && jQuery.isFunction(value);//目前jquery默認pass為空null,exec為true,value是否為函數
for ( var i = 0; i < length; i++ ) {
fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );//如果exec為true,,傳入操作對象的序列和操作屬性值作為參數,否則,設置屬性key的值為value
}
return elems;
}
// 獲取屬性
return length ? fn( elems[0], key ) : undefined;
},
now: function() {//返回當前時間
return (new Date()).getTime();
},