2012-01-01 89 views
2

预期它会调用foo函数的第一次,但是当我想使用的功能其他时间以下错误被抛出:var foo =(function(){...})(); ... 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

什么是“稍后”?后来在同一个脚本块中,还是在不同的脚本块中? – 2012-01-01 13:56:24

+0

你想要发生什么?你的问题并不清楚。 – 2012-01-01 14:04:53

+1

你在这里是一个非问题的典型例子。只需调用它,忘记它,并重新创建真棒网站! :) – Kos 2012-01-01 14:33:37

回答

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);}();(注意()在结束了吗? - 你不想那样))。

2

,因为你指定的,而不是本身的功能调用匿名函数来foo的结果,它不工作。

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

0

它不应该是

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

,而不是

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

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

1

你可以使用

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

但这不是很好的可读性。

相关问题