如何处理缺乏的JavaScript Object.bind(的)方法在IE 8如何处理缺乏的Java

2019-06-01 04:00发布

我写一些JavaScript使用的Object.bind方法。

funcabc = function(x, y, z){ 
    this.myx = x;
    this.playUB = function(w) {
        if ( this.myx === null ) {
            // do blah blah
            return;
        }

        // do other stuff
    };
    this.play = this.playUB.bind(this);
};

由于我在WinXP开发与Firefox,有时测试在Win7与IE 9或10,我没注意还是要注意一个事实,即IE8及以下不支持bind

这种特殊的脚本不使用画布,所以我有点犹豫注销所有IE 8的用户。

有没有一个标准的变通?

我让周围的排序在JavaScript中还行,但我还是有点小白。 所以,原谅我,如果该解决方案是完全显而易见的。

Answer 1:

有此页面上的良好兼容性脚本: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

只需复制并粘贴到你的脚本。

编辑:把下面的脚本清晰度。

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;
  };
}


Answer 2:

最好的解决办法是安装Modernizr的 。

Modernizr的告诉你当前的浏览器是否有这个功能本身实现与否,它提供了一个脚本加载器,所以你可以在polyfills拉旧的浏览器回填功能。

这里是生成您的自定义Modernizr的版本的链接:
http://modernizr.com/download/#-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes



Answer 3:

Function.prototype.bind未在Internet Explorer 8和下方支撑。 这里兼容性图表: http://kangax.github.io/es5-compat-table/

Mozilla开发者网络提供这种替代对于不执行.bind()本身旧的浏览器:

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;
  };
}


Answer 4:

Function构造是这样做的老式的方法:

 var foo = function(x,y,z){ return Function("x,y,z","return Math.max.call(this, x, y, z)")(x,y,z) } var bar = function(x,y,z){ return Function("x,y,z","return Math.min.call(this, x, y, z)")(x,y,z) } console.log(foo(1,2,3) ); console.log(bar(3,2,1) ); 

参考

  • 功能的JavaScript:利用函数对象的权力
  • 的eval()不邪恶,只是误会
  • 经由Function构造创建的函数的[范围]
  • 约翰Resig的-快速的JavaScript最大值/最小值


文章来源: How to handle lack of JavaScript Object.bind() method in IE 8