var foo =(function(){...})(); ... foo()不起作用

时间:2012-01-01 13:47:53

标签: javascript syntax

如预期的那样它第一次调用函数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 个答案:

答案 0 :(得分:4)

如果你展开

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

你会得到这个:

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

如您所见,您正在调用临时函数(此处以粗体显示):var foo = (function(){...}) () ;。这意味着foo未分配给函数对象,而是该函数调用的返回值。因此,除非临时函数返回一个函数(在这种情况下,您可能需要考虑重构),foo中存储的值将不可调用。

在JavaScript中,有两种方法可以存储函数对象:

A)在不调用函数的情况下传递函数(即foo = bar;而不是foo = bar())。

B) (如果需要传递参数)传递一个包含在另一个函数中的函数调用(不调用包装函数)(即foo = function {bar(param1, param2);};代替foo = function {bar(param1, param2);}(); 的注意事项(最后请注意 () ? - 您不希望这样做))。

答案 1 :(得分:2)

它不起作用,因为您将调用匿名函数的结果分配给foo,而不是函数本身。

当您尝试调用foo()时,您试图将第一个函数调用的结果(显然类型为DOMWindow)视为一个函数,这是不正确的。

答案 2 :(得分:1)

您可以使用

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

但这不是很容易阅读。

答案 3 :(得分:0)

不应该是

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

而不是

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

在你的情况下,你正在为foo分配一个匿名函数。