IE8中不支持function.bind()。使它专门用于IE8浏览器?或保持通用

时间:2015-06-15 04:23:58

标签: javascript internet-explorer-8 internet-explorer-11

我在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变慢吗? (支持绑定)

1 个答案:

答案 0 :(得分:3)

在已经有.bind()的浏览器中运行此代码的唯一缺点是需要下载额外的代码。当此代码在现代浏览器中运行时,它会命中第一个if语句并跳过其他所有内容。如果已支持.bind(),则此polyfill不会替换现有功能。它看到现有的功能已经存在,所以它什么都不做。

这样的Polyfills非常适合使用。它们允许您为现代浏览器(而不是最不常见的分母)编码,同时仍支持旧版浏览器。强烈建议使用这样的优质填料。

听起来你不清楚这个脚本是如何工作的。它的作用如下:

  1. 检查.bind()是否已在功能上可用。如果是,则脚本不会执行任何操作,因为它会跳过其余的所有代码。这就是现代浏览器中发生的情况。因此,只有第一个if语句在现代浏览器中执行。
  2. 如果.bind()不存在,那么它会将一个名为bind的属性添加到Function原型中,以便它可用于所有函数对象并为该属性分配一个函数。并且,该函数实现标准.bind()行为。现在,无论运行哪个浏览器,代码中的所有函数对象都将具有.bind()属性。