24

Estoy escribiendo un poco de JavaScript que usa el método Object.bind.Cómo manejar la falta de método Object.bind() de JavaScript en IE 8

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

Desde que se desarrollan en WinXP con Firefox y, a veces de prueba en Win7 con IE 9 o 10, no se dio cuenta o prestar atención al hecho de que IE8 y por debajo no son compatibles con bind.

Esta secuencia de comandos particular no utiliza el lienzo, por lo que estoy un poco indeciso de cancelar todos los usuarios de IE 8.

¿Existe una solución estándar?

Me estoy poniendo bastante bien en JavaScript, pero todavía soy un poco novato. Entonces, perdónenme si la solución es totalmente obvia.

+0

@micha, Sí, faltan: 'No se admite en los siguientes modos de documentos : Insólitos, estándares de Internet Explorer 6, estándares de Internet Explorer 7, estándares de Internet Explorer 8. – Alexander

Respuesta

49

Hay un buen guión de compatibilidad en esta página: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

sólo debes copiar y pegar en su guión.

EDIT: colocando la secuencia de comandos a continuación para mayor claridad.

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

Eso funcionó a las mil maravillas.Encontré una solución para el problema de vinculación y aprendí a buscar la palabra clave Compatibilidad en los documentos de mozilla. – Claude

+0

Por cierto, resulta que IE 8 tiene demasiadas funciones faltantes. Básicamente, tengo que seguir con los navegadores compatibles con HTML5. Sin el Handy-dandy Audio() no tiene sentido. – Claude

+0

@alex: ¿sabe si IE10 es compatible o necesita la solución temporal que mencionó? –

4

La mejor solución podría ser la instalación de Modernizr.

Modernizr le dice si el navegador actual tiene esta característica implementada de forma nativa o no y proporciona un gestor de scripts para que pueda incorporar polyfills a la funcionalidad de relleno en buscadores antiguos.

Aquí está el enlace para generar su versión personalizada Modernizr:
http://modernizr.com/download/#-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes

+0

¿Cómo comprobar si el navegador actual tiene esta característica implementada originalmente o no usando Modernizer? – dragonfly

+3

¡Esta respuesta es a la vez totalmente errónea y algo correcta! Es totalmente incorrecto porque Modernizr no ofrece una prueba de disponibilidad de enlace de función (probablemente porque la prueba es tan simple como inspeccionar si 'Function.prototype.bind! == undefined'). Sin embargo, es algo correcto porque Modernizr en realidad incluye una función para unir polyfill. Detalles de su inclusión aquí: https://github.com/Modernizr/Modernizr/issues/478 – WickyNilliams

+0

Modernizr> 3 ahora ya no incluye el polyfill para bind – gunnx

0

El constructor función es la forma tradicional de hacer esto:

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

Referencias

2

Function.prototype.bind no es compatible en Internet Explorer 8 y por debajo. Tabla de compatibilidades aquí: http://kangax.github.io/es5-compat-table/

Mozilla Developer Network proporciona esta alternativa para los navegadores antiguos que no implementan .bind() de forma nativa:

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