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

 Alexander15 июн. 2012 г., 18:22
@micha, да, отсутствует:Not supported in the following document modes: Quirks, Internet Explorer 6 standards, Internet Explorer 7 standards, Internet Explorer 8 standards.

Ответы на вопрос(4)

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

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

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

 03 нояб. 2015 г., 13:54
Modernizr & gt; 3 теперь больше не включает полифилл для привязки
 04 дек. 2013 г., 23:35
Этот ответ является одновременно совершенно неправильным и несколько правильным! Это совершенно неправильно, потому что Modernizr не предлагает тест на наличие привязки функции (вероятно, потому что тест так же прост, как проверкаFunction.prototype.bind !== undefined). Тем не менее, это несколько правильно, потому что Modernizr фактически включает в себя функцию bind polyfill! Подробности его включения здесь:github.com/Modernizr/Modernizr/issues/478
 17 февр. 2013 г., 17:01
Как проверить, имеет ли данный браузер встроенную функцию или не использует Modernizer?
Решение Вопроса

На этой странице есть хороший сценарий совместимости: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

Просто скопируйте и вставьте его в свой скрипт.

EDIT: размещение сценария ниже для ясности.

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;
  };
}
 15 янв. 2013 г., 20:57
@alex - знаете ли вы, поддерживает ли IE10 bind, или вам нужно обойти это, как вы упомянули?
 Claude15 июн. 2012 г., 18:39
Это работает как шарм. Нашел исправление для проблемы привязки и научился искать ключевое слово Compatibility в документах Mozilla.
 16 янв. 2013 г., 16:54
@pure_code - я бы предположил, что это так (метод связывания стал стандартным, поэтому он должен быть у всех новых браузеров). Но я не проверял его и сейчас не имею доступа к IE10.
 Claude15 июн. 2012 г., 18:41
Кстати, получается, что в IE 8 слишком много недостающих функций. По сути, мне нужно придерживаться HTML5-совместимых браузеров. Без удобного аудио () нет никакого смысла.
 16 янв. 2013 г., 18:35
stackoverflow.com/questions/14346781/… отправил вопрос по этому .... хороший ответ с диаграммой совместимости браузера

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

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

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

Ваш ответ на вопрос