How to handle lack of JavaScript Object.bind() method in IE 8

前端 未结 4 2083
长情又很酷
长情又很酷 2020-11-27 07:13

I am writing a bit of JavaScript that uses the Object.bind method.

funcabc = function(x, y, z){ 
    this.myx = x;
    this.playUB = function(w)         


        
相关标签:
4条回答
  • 2020-11-27 07:23

    The best solution could be to install Modernizr.

    Modernizr tells you whether the current browser has this feature natively implemented or not and it provides a script loader so you can pull in polyfills to backfill functionality in old browsers.

    Here is the link to generate your modernizr custom version:
    http://modernizr.com/download/#-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes

    0 讨论(0)
  • 2020-11-27 07:26

    Function.prototype.bind isn’t supported in Internet Explorer 8 and below. Compatibility chart here: http://kangax.github.io/es5-compat-table/

    Mozilla Developer Network provide this alternative for older browsers that don't implemented .bind() natively:

    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;
      };
    }
    
    0 讨论(0)
  • 2020-11-27 07:28

    There is a good compatability script on this page: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

    Just copy and paste it into your script.

    EDIT: placing the script below for clarity.

    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;
      };
    }
    
    0 讨论(0)
  • 2020-11-27 07:31

    The Function constructor is the old-fashioned way of doing this:

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

    References

    • Functional JavaScript: Harnessing the power of the Function Object
    • eval() isn’t evil, just misunderstood
    • [Scope] of Functions Created via the Function constructor
    • John Resig - Fast JavaScript Max/Min
    0 讨论(0)
提交回复
热议问题