我在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变慢吗? (支持绑定)
答案 0 :(得分:3)
在已经有.bind()
的浏览器中运行此代码的唯一缺点是需要下载额外的代码。当此代码在现代浏览器中运行时,它会命中第一个if
语句并跳过其他所有内容。如果已支持.bind()
,则此polyfill不会替换现有功能。它看到现有的功能已经存在,所以它什么都不做。
这样的Polyfills非常适合使用。它们允许您为现代浏览器(而不是最不常见的分母)编码,同时仍支持旧版浏览器。强烈建议使用这样的优质填料。
听起来你不清楚这个脚本是如何工作的。它的作用如下:
.bind()
是否已在功能上可用。如果是,则脚本不会执行任何操作,因为它会跳过其余的所有代码。这就是现代浏览器中发生的情况。因此,只有第一个if
语句在现代浏览器中执行。.bind()
不存在,那么它会将一个名为bind
的属性添加到Function
原型中,以便它可用于所有函数对象并为该属性分配一个函数。并且,该函数实现标准.bind()
行为。现在,无论运行哪个浏览器,代码中的所有函数对象都将具有.bind()
属性。