jQuery.proxy中的第三个参数用于什么?

时间:2012-03-22 07:10:02

标签: javascript jquery

在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 ..

2 个答案:

答案 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;
},