Javascript самостоятельно выполняемая функция "не является функцией" - PullRequest
21 голосов
/ 23 мая 2011

У меня есть:

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

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

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

Но firebug говорит, что Init - это не функция.

Ответы [ 6 ]

54 голосов
/ 23 мая 2011

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

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

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

Рассмотрим:

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

и

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

Удачного кодирования:)


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

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

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

var Init; (Init = function Init () {
  alert ("wee");
})()
2 голосов
/ 23 мая 2011

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

var Init = (function() {

    // some code

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

}());
2 голосов
/ 23 мая 2011

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

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

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

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

1 голос
/ 17 августа 2012

вы можете сделать, как указано выше, но вы также можете сделать

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

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

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

1 голос
/ 23 мая 2011

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

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

и при загрузке вызвать Init

0 голосов
/ 23 мая 2011

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

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

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

Другой способ - отделить объявление от выполнения:

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