2011-07-05 6 views
20

estoy curioso en cuanto a por qué esto funciona:función que llama con la explicación del alcance de ventana (0, function() {})()

var c = { 
    d: function myFunc() { 
     console.log(this === window); 
    } 
}; 
var a = { 
    b: function() { 
     console.log(this === a); 
     (0,c.d)(); 
     c.d(); 
    } 
}; 
a.b(); 

consola de salida:

True 
True 
False 

Por lo que parece sea ​​que (0, c.d)() es lo mismo que c.d.call(window), pero parece que no puedo encontrar mucho sobre por qué o cómo funciona esto. ¿Alguien puede explicar?

Desde: Closure Compiler Issues

violín: http://jsfiddle.net/wPWb4/2/

Respuesta

21

Si se escribe múltiples expresiones separadas por una coma (,), a continuación, se evaluarán todas las expresiones, pero el resultado final será con el valor de la última expresión :

var x = (1,2,3); 
console.log(x); // this will log "3" 

ahora (0,c.d) es una expresión que devolverá la función c.d, pero ahora no se c TH e this de la función más. Esto significa que this apuntará al objeto global (window), o permanecerá indefinido en modo estricto. Se podría obtener el mismo efecto con cualquiera de estos:

var f = function(x) { return x; }; 
f(c.d)(); 

O simplemente

var f = c.d; 
f(); 
16

La expresión (0, myFunc) es equivalente a poco myFunc. El comma operator toma varias expresiones, las evalúa y devuelve la última expresión, por lo que (0, myFunc) devuelve solo myFunc.

Ahora, en su método de b, this es igual a a porque b se adjunta a a. En otras palabras, b puede llamarse al a.b(). Sin embargo, es myFuncno unido a a (no se puede llamar por myFunca.myFunc()), por lo que en myFunc, this no puede ser a. De hecho, se llama a myFunc sin establecer su this por lo que su valor predeterminado es el objeto global window (o permanece indefinido en modo estricto), y por lo tanto su this es igual a window.

Usted se estará preguntando cuál es el objetivo de la (0, listeners[i])() cuando pudieron haber escrito listeners[i](). Considere el código que crea una matriz con dos elementos, dos funciones:

var listeners = [ 
    function() { alert(this); }, 
    function() { alert(this); } 
]; 

Cuando se llama a listeners[0](), a continuación, en la función listeners[0], this es igual a listeners, porque 0 se adjunta a listeners, al igual que cómo era b adjunto al a. Sin embargo, cuando llama a la función por (0, listeners[0])(), listeners[0] está "desacoplado" de la matriz listeners.* Dado que la función desacoplada ya no está asociada a nada, su this es el objeto global window.

* Es como si escribió:

var temp = listeners[0]; 
temp(); 
Cuestiones relacionadas