我在JS中使用function.bind(),这在IE8中是不受支持的,所以我在下面的代码中添加了使其工作的代码。(参考StackOverflow答案)
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,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
}为所有浏览器保留此脚本代码,会不会使其他浏览器(如IE11 )速度变慢?(支持绑定)
发布于 2015-06-15 04:48:23
在已经有.bind()的浏览器中运行此代码的唯一缺点是要下载一些额外的代码。当这段代码在现代浏览器中运行时,它会命中第一个if语句并跳过其他所有内容。如果已经支持.bind(),则此填充不会替换现有功能。它看到现有的功能已经存在,所以它什么也不做。
像这样的填充物是很好的使用。它们允许您为现代浏览器(而不是最不常见的分母)编写代码,同时仍然支持较旧的浏览器。这种良好的填充物是强烈推荐的。
听起来你还不清楚这个脚本是怎么工作的。它所做的工作如下:
.bind()是否已经在函数上可用。如果是的话,那么脚本就什么也不做了,因为它跳过了其余的代码。这就是在现代浏览器中发生的事情。因此,只有第一个if语句在现代浏览器中执行。.bind()不存在,那么它将向Function原型添加一个名为bind的属性,这样它将在所有函数对象上可用,并为该属性分配一个函数。并且,该函数实现标准的.bind()行为。现在,无论在哪个浏览器中运行,代码中的所有函数对象都将具有一个.bind()属性。https://stackoverflow.com/questions/30837332
复制相似问题