2011-05-24 18 views
7

Quiero invocar la función window.setTimeot con mi ámbito personalizado, así que utilizo el método call, pero hay algo mal.javascript setTimeout call error

function foo() { 
    this.bar = function() { 
     console.log("keep going"); 
     window.setTimeout.call(this,this.bar,100); 
    } 
    this.bar(); 
} 

new foo; 

en Firefox Esto imprime a la consola sólo 1 línea y luego nada, y en Google Chrome que arroja un TypeError.

¿Cuál es el problema en mi código?

Respuesta

8

El uso de call no ayuda aquí: llama a setTimeout con su objeto this, pero la función de devolución de llamada se sigue llamando desde el ámbito global. Lo que realmente quiere hacer es algo como esto:

function foo() { 
    var self = this; 
    this.bar = function() { 
     console.log("keep going"); 
     window.setTimeout(function() { self.bar(); }, 100); 
    } 
    this.bar(); 
} 

Editar: Si realmente quieres algo similar al enfoque call, puede utilizar bind que se une el valor this para una función:

window.setTimeout(this.bar.bind(this), 100); 

Sin embargo, esto es parte de la nueva especificación ECMAScript 5 que aún no es compatible con todos los navegadores.

+0

gracias, sé que de esta manera funciona, estoy tratando de usar la 'llamada'. –

+1

@omnosis: No puede usar 'call' para este propósito. Lo que está buscando es ['bind'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind), que es parte de la nueva especificación de ECMAScript 5. Usando eso, puedes hacer algo como esto: 'window.setTimeout (this.bar.bind (this), 100)'. – casablanca

+0

tiene perfecto sentido. Cometí el mismo error, no tiene sentido usar 'call' en' setTimeout' porque no estás tratando de cambiar 'this' of' setTimeout', sino más bien, la función que estás pasando como argumento. aclamaciones – chiliNUT

Cuestiones relacionadas