標籤:
proxy : 改變this指向
使用方法1:
function show(){
alert(this);
}
$.proxy(show,document)(); //document
使用方法2:
function show(n1,n2){
alert(n1);
alert(n2);
alert(this);
}
$.proxy(show,document)(3,4); //document 3 4
$.proxy(show,document,3,4)(); //document 3 4
$.proxy(show,document,3)(4); //document 3 4
使用方法3:
var obj = {
show:function(){
alert(this);
}
};
$(document).click($.proxy(obj,‘show‘)); //object
從proxy方法的源碼可以看出,以下程式碼片段是針對 ‘ 使用方法3 ‘ 做了處理,它允許第二個參數為字串,其實等同於:$(document).click($.proxy(obj.show,obj));
if ( typeof context === "string" ) { tmp = fn[ context ]; context = fn; fn = tmp;}
以下程式碼片段是針對傳參的處理,先使用core_slice.call截取第3個參數到最後,再擷取調用時的參數,最後合并。
// Simulated bindargs = core_slice.call( arguments, 2 );proxy = function() { return fn.apply( context, args.concat( core_slice.call( arguments ) ) );};
proxy完整的代碼:
var core_slice = Array.prototype.slice, ....................jQuery.extend({ ...................... // A global GUID counter for objects guid: 1, // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { var tmp, args, proxy; if ( typeof context === "string" ) { tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind args = core_slice.call( arguments, 2 ); proxy = function() { return fn.apply( context, args.concat( core_slice.call( arguments ) ) ); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || jQuery.guid++; return proxy; }, ...............});
jquery工具方法proxy