Функция самозапуска 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(); })();