javascript - comandos - clusvcadm
La función de auto ejecución de Javascript "no es una función" (6)
Yo tengo:
var Init = (function() {
my js goes here
})();
Y mi js se ejecuta correctamente cuando se carga la página. Tambien tengo:
$(''form :checkbox'').change(function() {
Init();
});
Pero firebug dice que Init no es una función.
No es una función.
(function() {
...
})()
Evalúa la función anónima en ese momento . Y el resultado de la evaluación aparentemente no devuelve un objeto de función en este caso :-)
Considerar:
f = (function() {
return "not a function :("
})()
alert(f())
y
f = (function() {
return function () { return "Yay!" }
})()
alert(f())
Feliz codificacion :)
Aquí hay una función que "ejecutará algo una vez" y luego "devolverá algo para ejecutar más tarde". (Consulte "Puede [asignar] una función o llamarla; no puede hacer las dos cosas ..." de la respuesta de Slaks). Sin embargo, no lo haría así.
Init = (function () {
function Init () {
alert("whee!")
}
Init()
return Init
})()
Init()
Aquí hay otra solución (mucho más corta / más limpia) de CD Sanchez (ver comentario) que aprovecha el hecho de que una asignación se evalúa al valor asignado:
var Init; (Init = function Init () {
alert ("wee");
})()
Para que Init
ejecute como una función, su código dentro de la función de ejecución automática debe devolver una función, y la única razón para hacerlo es si necesita construir una función específica de forma dinámica que dependa de algunos estados de datos:
var Init = (function() {
// some code
return function () {
// some dynamic code dependent upon your previous code
};
}());
Podrías hacer lo anterior, pero también podrías hacerlo.
function Init(){...}();
No hay nada que le impida tener una función autoejecutable con nombre. Si desea evitar tener una función llamada Init, puede hacer lo que CD Sanchez sugirió y asignarlo en la ejecución.
Los (); Al final lo hace auto ejecutable. Envolver la función entre paréntesis la hace anónima. Pero parece que no quieres que sea anónimo.
Puedes intentar declararlo de esta manera:
(function Init(){
/*...*/
})();
Pero esto reducirá el uso de esta función en su cuerpo.
Otra forma es separar declaración de ejecución:
var Init = function(){
/*...*/
},
initResult = (function(){ return Init(); })();
Rápido Intenta reemplazar así
var Init = function() {
my js goes here
});
y en la llamada de llamada Init
Init
no es una función; Es el resultado de llamar a la función.
Puedes crear una función o llamarla; No puedes hacer las dos cosas a la vez.
Técnicamente, podría arreglarlo agregando return arguments.callee;
para devolver la función de la llamada.
Sin embargo, esa es una idea tonta.
Probablemente no deberías estar llamando a la función; Necesitas entender lo que quieres que haga tu código.