如预期的那样它第一次调用函数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();
不起作用?)
答案 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分配一个匿名函数。