先貼代碼:
var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
if (!(callingContext instanceof boundFunc))
return sourceFunc.apply(context, args);
var self = baseCreate(sourceFunc.prototype);
var result = sourceFunc.apply(self, args);
if (_.isObject(result))
return result;
return self;
};
// Create a function bound to a given object (assigning this
, and arguments,
// optionally). Delegates to ECMAScript 5's native Function.bind
if
// available.
.bind = function(func, context) {
if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
if (!.isFunction(func)) throw new TypeError('Bind must be called on a function');
var args = slice.call(arguments, 2);
var bound = function() {
return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
};
return bound;
};
想問下,executeBound(func, bound, context, this, args.concat(slice.call(arguments)))這個裡面的this是否就是指代調用_.bound的對象,然後後面為何要做(!(callingContext instanceof boundFunc))這個判斷,網上查了好久,沒查出來,請高手指導下,非常感謝
這個得看如何調用的,因為this對象可以通過call和apply進行更改,如果不是通過apply或者call執行調用的,那麼就是指向bound的實例對象了
instanceof是判斷對象是否屬於某一類型。如果你不判斷,可能會出錯。因為要調用這個類型的方法,不是這個類型的實例可能方法不存在而出錯
http://www.ibm.com/developerworks/cn/web/1306_jiangjj_jsinstanceof/