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ą.

Author: Phillip Senn, 2011-05-23

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");
})()
 54
Author: ,
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 22:06:18

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
    };

}());
 2
Author: mVChr,
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ł.

 2
Author: SLaks,
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

 1
Author: Rizwan Sharif,
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.

 1
Author: fijiaaron,
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(); })();
 0
Author: dev-null-dweller,
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