MDN's polyfill for Function.prototype.bind(粘贴在下面),使用逗号运算符。由于逗号运算符返回最后一个操作数,并且第一个操作数(oThis
)不执行任何操作(如调用函数或进行赋值),因此它看起来毫无意义。但是我假设MDN知道它在做什么,所以:在这种情况下逗号运营商做了什么有用的技巧?
if (!Function.prototype.bind) {
Function.prototype.bind = function (oThis) {
if (typeof this !== "function") {
// closest thing possible to the ECMAScript 5
// internal IsCallable function
throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function () {},
fBound = function () {
return fToBind.apply(this instanceof fNOP && oThis
? this
: oThis, // <-- what's going on here?
aArgs.concat(Array.prototype.slice.call(arguments)));
};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
}
要明确的是,我建议您可以像这样写fBound
,并让它做同样的事情:
fBound = function () {
return fToBind.apply(this instanceof fNOP && oThis
? this
: aArgs.concat(Array.prototype.slice.call(arguments)));
};
答案 0 :(得分:3)
它不是逗号运算符,它是一个逗号,它将函数调用的参数分隔为fToBind
。你可以改写为:
fBound = function () {
var args = aArgs.concat(Array.prototype.slice.call(arguments));
if (this instanceof fNOP && oThis) {
return fToBind.apply(this, args)
}
return fToBind.apply(oThis, args)
};
答案 1 :(得分:1)
它等效于以下内容(除了分配给arg1和arg2的表达式在fToBind.apply之前计算,结果存储在变量中):
var arg1 = this instanceof fNOP && oThis ? this : oThis;
var arg2 = aArgs.concat(Array.prototype.slice.call(arguments));
return fToBind.apply(arg1, arg2);
也就是说,逗号作为参数分隔符存在于apply
函数调用中,并且不解析/实现为逗号运算符。