正如预期的那样,它第一次调用函数 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();
不工作?)
请您参考如下方法:
如果展开
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);}();
(注意 ()
最后?——你不想要那个))。