Rus*_*lan 22 javascript bind function ecmascript-5
关于EcmaScript-5 Function.prototype.bind实现,我有一个非常有趣的问题.通常在使用bind时,您可以这样做:
var myFunction = function() {
alert(this);
}.bind(123);
// will alert 123
myFunction();
Run Code Online (Sandbox Code Playgroud)
好的,这很酷,但是当我们这样做时会发生什么?
// rebind binded function
myFunction = myFunction.bind('foobar');
// will alert... 123!
myFunction();
Run Code Online (Sandbox Code Playgroud)
我理解,就Function.prototype.bind的实现方式而言,这是完全合乎逻辑的行为(https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind).但在现实生活中,这种行为完全没用,不是吗?问题是:是bug还是功能?如果它是一个错误,为什么它没有提到?如果它是一个功能,为什么那么具有原生"绑定"实现的谷歌浏览器的行为完全相同?
为了更清楚,我认为更有意义,这里是实现Function.prototype.bind的代码片段有点不同:
if (!Function.prototype.bind) {
Function.prototype.bind = function() {
var funcObj = this;
var original = funcObj;
var extraArgs = Array.prototype.slice.call(arguments);
var thisObj = extraArgs.shift();
var func = function() {
var thatObj = thisObj;
return original.apply(thatObj, extraArgs.concat(
Array.prototype.slice.call(
arguments, extraArgs.length
)
));
};
func.bind = function() {
var args = Array.prototype.slice.call(arguments);
return Function.prototype.bind.apply(funcObj, args);
}
return func;
};
}
Run Code Online (Sandbox Code Playgroud)
所以现在试试这个:
// rebind binded function
myFunction = myFunction.bind('foobar');
// will alert... "foobar"
myFunction();
Run Code Online (Sandbox Code Playgroud)
在我看来,取代"这个"更有意义......
那么你们怎么想呢?
Jef*_*den 14
先例Function.prototype.bind是在各种JS框架中实现该想法.据我所知,其中没有一个允许this通过后续绑定来更改绑定.你也可以问为什么他们都没有允许这种绑定改变,以问为什么ES5不允许它.
你不是我听过的唯一一个认为奇怪的人.使用Mozilla的JS引擎的Chris Leary(就像我一样)认为这有点奇怪,几个月前在Twitter上提出了这个问题.在一个稍微不同的形式中,我记得有一个Mozilla实验室的黑客质疑是否有某种方法可以"解除绑定"一个函数,从中提取目标函数.(如果你可以这样做,你当然可以将它绑定到另一个this,至少如果你也可以提取绑定的参数列表也传递它.)
我不记得bind被指定时正在讨论的问题.但是,当这个东西被淘汰时,我并没有特别关注es-discuss邮件列表.也就是说,我不相信ES5会在这个领域进行创新,只是"铺一条牛路",借用一句话.
如果您撰写了足够详细的提案,您可能可以提出一些内省的方法来解决这些问题以进行讨论.另一方面,绑定是一种信息隐藏机制,会削弱其采用.如果你有时间,可能值得尝试提出一些建议.我的猜测是隐藏信息会妨碍提案被采纳.但这只是一个可能错误的猜测.只有一种方法可以找到......