Функция самозапуска Javascript "не является функцией"

У меня есть:

var Init = (function() {
   my js goes here
})();

И мои js выполняются правильно, когда страница загружается. У меня также есть:

$('form :checkbox').change(function() {
   Init();
});

Но firebug говорит, что Init не является функцией.

Ответ 1

Это не функция.

(function() {
   ...
})()

автоматически оценивает анонимную функцию. И результат оценки, по-видимому, не возвращает функционал-объект в этом случае: -)

Рассмотрим:

f = (function() {
   return "not a function :("
})()
alert(f())

и

f = (function() {
   return function () { return "Yay!" }
})()
alert(f())

Счастливое кодирование:)


Вот функция, которая "выполнит что-то один раз", а затем "вернет что-то для выполнения позже". (См. "Вы можете либо [назначить] функцию, либо вызвать ее, вы не можете выполнять оба..." из ответа Slaks.) Однако я не сделал бы этого так.

Init = (function () {
  function Init () {
    alert("whee!")
  }
  Init()
  return Init
})()
Init()

Вот еще одно решение (намного короче/чище) от CD Sanchez (см. комментарий), в котором используется тот факт, что присваивание оценивается назначенным значением:

var Init; (Init = function Init () {
  alert ("wee");
})()

Ответ 2

Init не является функцией; это результат вызова функции.

Вы можете либо создать функцию, либо вызвать ее; вы не можете сделать оба сразу.

Технически вы можете исправить это, добавив return arguments.callee;, чтобы вернуть функцию из вызова.
Тем не менее, эта глупая идея.

Вероятно, вы не должны вызывать функцию; вам нужно понять, что вы хотите от своего кода.

Ответ 3

Для того чтобы Init выполнялся как функция, ваш код внутри функции самоисполнения должен возвращать функцию, и единственная причина для этого заключается в том, что вам нужно построить определенную функцию, динамически зависящую от некоторых состояний данных

var Init = (function() {

    // some code

    return function () {
        // some dynamic code dependent upon your previous code
    };

}());

Ответ 4

Быстрый Попробуйте заменить это как

var Init = function() {
   my js goes here
});

и при вызове нагрузки Init

Ответ 5

вы могли бы сделать так, как описано выше, но вы также можете сделать

function Init(){...}(); 

Вам нечего мешать иметь именованную функцию самоисполнения. Если вы хотите избежать функции с именем Init, вы можете сделать это, как предложил CD Sanchez, и назначить его при выполнении.

(); в конце делает его самоисполнением. Объединение функции в круглые скобки делает ее анонимной. Но, похоже, вы не хотите, чтобы это было анонимно.

Ответ 6

Вы можете попробовать объявить это следующим образом:

(function Init(){ 
    /*...*/ 
})();

Но это уменьшит использование этой функции в теле

Другим способом является отключение объявления от выполнения:

var Init = function(){
    /*...*/
    },
    initResult = (function(){ return Init(); })();