2012-01-01 88 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(){...})(); 

但這不是很好的可讀性。

相關問題