Javascript self executing function " nie jest funkcją"
Mam:
var Init = (function() {
my js goes here
})();
I mój js wykonuje poprawnie po załadowaniu strony. Ja też mam:
$('form :checkbox').change(function() {
Init();
});
Ale firebug mówi, że Init nie jest funkcją.
6 answers
To nie jest funkcja.
(function() {
...
})()
Ocenia funkcję anonimową bezpośrednio wtedy . I wynik oceny najwyraźniej nie zwraca funkcji-obiektu w tym przypadku: -)
Rozważmy:
f = (function() {
return "not a function :("
})()
alert(f())
I
f = (function() {
return function () { return "Yay!" }
})()
alert(f())
Happy coding:)
Tutaj jest funkcja, która "wykona coś raz", a następnie "zwróci to coś, aby wykonać później". (Zobacz " możesz albo [przypisać] funkcję, albo ją wywołać; nie możesz wykonać obu..." od Slaks odpowiedz) Jednak nie zrobiłbym tego w ten sposób.
Init = (function () {
function Init () {
alert("whee!")
}
Init()
return Init
})()
Init()
Oto inne rozwiązanie (znacznie krótsze/czystsze) z CD Sancheza (patrz komentarz), które wykorzystuje fakt, że przypisanie jest przypisane do przypisanej wartości:
var Init; (Init = function Init () {
alert ("wee");
})()
Aby Init
mogła być wykonywana jako funkcja, Twój kod wewnątrz funkcji wykonującej musi zwracać funkcję, a jedynym powodem jest to, że musisz zbudować określoną funkcję dynamicznie zależną od niektórych stanów danych:
var Init = (function() {
// some code
return function () {
// some dynamic code dependent upon your previous code
};
}());
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-22 21:35:34
Init
nie jest funkcją; jest wynikiem wywołania funkcji.
Możesz utworzyć funkcję lub ją wywołać; nie możesz zrobić obu naraz.
Technicznie można to naprawić dodając return arguments.callee;
, aby zwrócić funkcję z wywołania.
Jednak to głupi pomysł.
Prawdopodobnie nie powinieneś wywoływać funkcji; musisz zrozumieć, co chcesz, aby Twój kod robił.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-22 21:40:36
Quick one Spróbuj zastąpić TAK
var Init = function() {
my js goes here
});
I przy wywołaniu load INIT
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-22 21:33:59
Można zrobić jak wyżej, ale można też zrobić
function Init(){...}();
Nic nie powstrzyma cię od posiadania nazwanej funkcji samo-wykonującej. Jeśli chcesz uniknąć posiadania funkcji o nazwie Init, możesz zrobić tak jak sugerował i przypisać ją do wykonania.
The (); Na końcu sprawia, że jest wykonywana samodzielnie. Zawijanie funkcji w nawiasy powoduje, że jest ona anonimowa. Ale wygląda na to, że nie chcesz, żeby to było anonimowe.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-16 21:05:49
Możesz spróbować zadeklarować to w ten sposób:
(function Init(){
/*...*/
})();
Ale to zmniejszy użycie tej funkcji w jego ciele
Innym sposobem jest oddzielenie deklaracji od wykonania:
var Init = function(){
/*...*/
},
initResult = (function(){ return Init(); })();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-22 21:59:06