1

我比什么都好奇。它如何将上下文传递给函数。它是否将函数包装在对象中?我确信有一些简单直接的代码可以在没有 jquery 代理的 js 中执行此操作

function abc(){
  console.log(this.name);
}
var obj={name:"Something"};
$.proxy(abc,obj);

如果没有 jquery 代理,我怎么能做到这一点?

4

1 回答 1

4

如果没有 jQuery,您可以使用bind

var newFunction = abc.bind(obj);

如果你想兼容 IE8,你可以这样做

var newFunction = function(){ abc.call(obj) };

以下是 jQuery 的做法:

// Bind a function to a context, optionally partially applying any
// arguments.
proxy: function( fn, context ) {
    var args, proxy, tmp;

    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 || this, 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;
},
于 2013-07-31T17:46:36.287 回答