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

var foo = (function(){...})(); ... foo() doesn't work

本文关键字:Foo 不起作用 foo function Var      更新时间:2023-09-26

如预期的那样,它第一次调用函数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);}(); (注意末尾的 () ) ?——你不想那样))

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

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

你可以使用

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

但是这不是很好读

应该是

<>之前Var foo = function() {.....}之前

代替

<>之前Var foo = (function() {..}) ();之前

在你的例子中,你正在给foo分配一个匿名函数