在jQuery API doc中,jQuery.proxy函数用法:
jQuery.proxy( function, context )
<小时/> 功能将更改其上下文的功能 context 应该设置函数的上下文(this)的对象。
jQuery.proxy( context, name )
<小时/> context 应该设置函数上下文的对象 name 其上下文将被更改的函数的名称(应该是上下文对象的属性)。
proxy : function(fn, proxy, thisObject){
if ( arguments.length === 2 ) {
if (typeof proxy === "string" ) {
thisObject = fn;
fn = thisObject[proxy];
proxy = undefined;
} else if ( proxy && !jQuery.isFunction( proxy ) ) {
thisObject = proxy;
proxy = undefined;
}
}
if ( !proxy && fn ) {
proxy = function() {
return fn.apply( thisObject || this, arguments );
};
}
// So proxy can be declared as an argument
return proxy;
}
但是当我查看jQuery源代码时,函数代理。我发现声明了3个参数。
所以我想知道第三个参数的用途是什么,无法理解代码:(
我编写了一个代码段来测试函数。
var someObj = { somefnc : function() {} };
function fnc() {
this.somefnc();
console.log(arguments);
}
var proxyedFnc = jQuery.proxy(fnc, undefined, someObj, "arg1","arg2");
proxyedFnc();
//output: []
我想知道为什么这些论点没有传递给fnc ..
答案 0 :(得分:6)
xdazz是对的,最新的1.7.2版本有不同的语法,它还允许多个额外的参数合并到apply
并传递到代理函数,f.ex:
var fn = function() {
console.log(this.foo, arguments);
};
var obj = {
foo: 'bar'
};
$.proxy(fn, obj, 'one', 'two')();
运行此代码将打印bar ["one", "two"]
您可以通过以下方式获得相同的结果:
$.proxy(fn, obj)('one', 'two');
我可能还会补充说,官方API中没有记录这一点,因此在不同版本中,“引擎盖下”可能会有所不同。此代码在1.7.2中进行了测试。
答案 1 :(得分:0)
以下是来自 jquery-1.7.2.js 的来源,您确定在源代码和api doc之间检查相同的版本吗?
// Bind a function to a context, optionally partially applying any
// arguments.
proxy: function( fn, context ) {
if ( typeof context === "string" ) {
var 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
var args = slice.call( arguments, 2 ),
proxy = function() {
return fn.apply( context, args.concat( 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 || proxy.guid || jQuery.guid++;
return proxy;
},