it-roy-ru.com

Как справиться с отсутствием метода JavaScript Object.bind () в IE 8

Я пишу немного 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, но я все еще немного новичок. Так что прости меня, если решение совершенно очевидно. 

24
Claude

На этой странице есть хороший сценарий совместимости: 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;
  };
}
49
alexwells

Лучшим решением может быть установка Modernizr

Modernizr сообщает вам, реализована ли в текущем браузере эта функция изначально или нет Он предоставляет загрузчик сценариев, чтобы вы могли использовать полизаполнения для обратной засыпки в старых браузерах. 

Вот ссылка для создания вашей пользовательской версии modernizr:
http://modernizr.com/download/#-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes

4
antonjs

Function.prototype.bind не поддерживается в Internet Explorer 8 и ниже. Таблица совместимости здесь: http://kangax.github.io/es5-compat-table/

Mozilla Developer Network предоставляет эту альтернативу для старых браузеров, которые изначально не поддерживают .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;
  };
}
2
Karl Glennon

Конструктор 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) );

Рекомендации

0
Paul Sweatte