在jQuery API doc中,jQuery.proxy函数用法:
jQuery.proxy( function, context )
Run Code Online (Sandbox Code Playgroud)
jQuery.proxy( context, name )
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
但是当我研究jQuery源代码时,函数代理.我发现声明了3个参数.
所以我想知道第三个参数的用途是什么,无法理解代码:(
我编写了一个代码段来测试函数.
var someObj = { somefnc : function() {} };
function fnc() {
this.somefnc();
console.log(arguments);
}
var proxyedFnc = jQuery.proxy(fnc, undefined, someObj, "arg1","arg2");
proxyedFnc();
//output: []
Run Code Online (Sandbox Code Playgroud)
我想知道为什么这些论点没有传递给fnc ..
xdazz是对的,最新的1.7.2版本有不同的语法,它还允许将多个额外的参数连接到apply并传递给代理函数f.ex:
?var fn = function() {
console.log(this.foo, arguments);
};
var obj = {
foo: 'bar'
};
$.proxy(fn, obj, 'one', 'two')();
Run Code Online (Sandbox Code Playgroud)
运行此代码将打印 bar ["one", "two"]
你会得到相同的结果:
$.proxy(fn, obj)('one', 'two');
Run Code Online (Sandbox Code Playgroud)
我还可以补充一点,官方API中没有记录这一点,因此在不同版本中,"引擎盖下"可能会有所不同.此代码在1.7.2中进行了测试.