underscore 1.7 _.bind函数源码疑惑
这几天在阅读underscore的源码,看到函数方法的时候,遇到一点问题。请大家,帮个忙啦~
underscore 1.7 bind函数源码
javascript
_.bind = function(func, context) { var args, bound; 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'); args = slice.call(arguments, 2); bound = function() { if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); Ctor.prototype = func.prototype; var self = new Ctor; Ctor.prototype = null; var result = func.apply(self, args.concat(slice.call(arguments))); if (_.isObject(result)) return result; return self; }; return bound; };
问题
实际使用时,哪一种情况会跳过下面的if判断,执行后面的代码?能否举个实例?
javascript
if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
帕琪的红茶
9 years, 8 months ago
Answers
作为构造函数调用的情况下,以下是一个简化了的版本,可以直接在console里执行查看
var _ = {};
_.bind = function(func, context) {
var args, bound;
args = [].slice.call(arguments, 2);
bound = function() {
if (!(this instanceof bound)) return func.apply(context, args.concat([].slice.call(arguments)));
console.log('skip');
return self;
};
return bound;
};
var f = function() {};
var bf = _.bind(f, {});
bf();
new bf();
这个问题本质是对JS函数调用中this的理解
早安G组
answered 9 years, 8 months ago