var foo = (function () {...}) ();... foo () не работает - PullRequest
2 голосов
/ 01 января 2012

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

Uncaught TypeError: Property 'foo' of object [object DOMWindow] is not a function

цель состояла в том, чтобы определить функцию (которая должна вызываться немедленно, но также и позже) - нужно ли мне писать следующее:

function foo() {...}
foo();
... // later on
foo();

или есть более элегантное решение?

РЕДАКТИРОВАТЬ: если вы не можете использовать переменную (даже если это анонимная функция) в качестве функции, в чем ее преимущество в любом случае?

(почему

var foo = (function(){...})();
... // later on
foo();

не работает?)

Ответы [ 4 ]

4 голосов
/ 01 января 2012

Если вы развернете

var foo = (function(){...})();
foo();

, вы получите это:

function temp() {
    ...
}
foo = temp();

Как видите, вы вызываете функцию temp (выделено здесь жирным шрифтом): var foo = (function(){...})();.Это означает, что foo присваивается не объекту функции, а возвращаемому значению этого вызова функции.Поэтому, если временная функция не возвращает функцию (и в этом случае вам может потребоваться рефакторинг), значение, хранящееся в foo, не будет вызываться.

В JavaScript есть два способа сохранитьобъект функции:

A) Передать функцию без ее вызова (т. е. foo = bar; вместо foo = bar()).

B) (если вам нужно передать параметры) передать вызов функции, заключенный в другую функцию (без вызова функции-оболочки) (т.е. foo = function {bar(param1, param2);}; вместо foo = function {bar(param1, param2);}(); (обратите внимание на () в конце? - вы этого не хотите) ).

2 голосов
/ 01 января 2012

Это не работает, потому что вы присваиваете результат вызова анонимной функции foo вместо самой функции.

Когда вы затем пытаетесь вызвать foo(), вы пытаетесь обработатьрезультат первого вызова функции (по-видимому, типа DOMWindow) как функции, что неверно.

1 голос
/ 01 января 2012

Вы можете использовать

var foo;
(foo = function(){...})();

, но это плохо читается.

0 голосов
/ 01 января 2012

Не должно ли быть

var foo = function()  { ..... }

вместо

var foo = (function() { .. } ) ();

в вашем случае вы назначаете анонимную функцию для foo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...