2010-02-23 12 views
8

nextplease.init = function() {...} es una función sin argumentos. Esperaría que nextplease.init y function() {nextplease.init();} se comporten de forma idéntica. ¿Hay alguna diferencia posible entre ellos (obviamente, puedes asignar algo al nextplease.init, pero excluyamos eso)? En particular, ¿puede haber una diferencia en el comportamiento entre window.addEventListener("load", nextplease.init, false); y window.addEventListener("load", function() {nextplease.init();}, false);?Valores de función en JavaScript

El error que estoy tratando de encontrar se describe en Objects in JavaScript defined and undefined at the same time (in a FireFox extension) Alguien ha sugerido que usar el primer formulario en lugar del segundo podría hacer la diferencia.

+2

En realidad, en JS se puede acceder a los argumentos de la variable 'arguments', por lo que no podemos decir de manera fiable el número de argumentos tomaría una función. – kennytm

+0

Cierto, pero eso no se hace en este caso. Proporcionaré un enlace al código. –

+1

El segundo creará un nuevo contexto de ejecución en el que se ejecutará nextplease.init(). Por lo tanto, la pila de contexto de cadena de alcance/ejecución será una más grande. –

Respuesta

4

Una diferencia importante es el valor de la palabra clave "this" dentro del cuerpo de la función a la que se hace referencia en nextplease.init.

Suponga nextplease se define como tal:

nextplease = {}; 
nextplease.someCustomProperty = "hello"; 
nextplease.init = function() { alert(this.someCustomProperty); } 

En el primer ejemplo, el valor de "este" sería el objeto DOM, y la alerta habría fallan:

window.addEventListener("load", nextplease.init, false);  

En el segunda forma, el valor de "este" sería el objeto nextplease, y la alerta diría, "hola":

window.addEventListener("load", function() {nextplease.init();}, false); 

Referencia de la documentación del MDC:

https://developer.mozilla.org/en/DOM/element.addEventListener

0

Hay 2 posibles diferencias

window.addEventListener("load", nextplease.init, false); 

Esto llamará a la función y eso es todo. Si quisiera agregar parámetros, entonces esto no podría establecerlos.

window.addEventListener("load", function() {nextplease.init();}, false); 

Esto, por otro lado, le permite llamar a más de una función y le permite establecer parámetros. También agrega una sobrecarga adicional al invocar una función y almacenar una función en la memoria.

0

estos dos:

window.addEventListener("load", nextplease.init, false); 
window.addEventListener("load", function() {nextplease.init();}, false);? 

son casi exactamente de la misma, suponiendo nextplease.init es un objeto de función.

La única diferencia es que en el segundo caso, los argumentos pasados ​​a la función externa (aunque su firma no define ninguno, aún se pueden pasar) no se pasarán a nextplease.init(). Pero como esto solo está pasando por la API addEventListener, sabrá lo que se pasará con anticipación.

Cuestiones relacionadas