2013-11-03 65 views
6

我知道,這可以爲匿名函數執行命名函數聲明之後

(function toBeExecutedImmediately() { 
    // Code 
}()); 

我有,我想在其他地方使用函數來完成,但也應立即執行。是否可以用一條語句代替?返回值是不需要的。

function toBeExecutedImmediately() { 
    // Code 
}; 

toBeExecutedImmediately(); 
+3

第一個不是一個匿名函數。它有一個名字。 – Joren

+0

你已經解決了,你只需要嘗試一下。 – Theraot

+2

@wared:不,名稱'toBeExecutedImmediately'不會被添加到包含的範圍,因此它在其他地方不可用。 –

回答

4

是否有可能有一個說法,而不是下面做呢?

號正如您看到的,指定的函數表達式(你的第一個例子)名稱不添加到包含範圍(除broken engines   —我看着你,IE8和更早版本),所以你不能在其他地方調用這個函數而不做任何事情來做到這一點,當然也可以使用函數聲明(你的第二個例子),你必須給這個名字兩次。

最好的辦法可能是繼續前進,然後做聲明和單獨調用(第二個例子)。

我們可能會想出一些令人費解的技術上符合「單一聲明」的定義,但它不可能縮短。

如果簡潔是你的目標,這是兩種說法,但簡短:

var f = function() { 
    // Code 
}, toBeExecutedImmediately = f; 
f(); 

不過,雖然相對短暫的,我會說的清晰度受到影響。 :-)

當然,如果你添加一個輔助函數,任何事情都是可能的。例如:

// The helper 
function defineAndExecute(f) { 
    f(); 
    return f; 
} 

// using it 
var toBeExecutedImmediately = defineAndExecute(function() { 
    // Do work here 
}); 

該功能在技術上是匿名的,但您可以通過var來調用它。 (你可以在這裏使用一個命名函數表達式太,但當然,這會破壞目標  —沒有重複的名字  —據我所知)。


旁註:你的第一個例子是不是「一個匿名功能「。該函數有一個專有名稱,它是一個名爲函數表達式的。只是使用命名函數表達式,與函數聲明不同,該名稱不會添加到包含範圍中。

+0

我不知道*破碎引擎*部分,這很有趣! – xiankai

+0

@xiankai:是的,IE8和更早的**真的**得到命名函數表達式錯誤,詳細信息:http://blog.niftysnippets.org/2010/09/double-take.html他們實際上創建兩個不同的函數,在不同的倍。 –

+0

這是一個很好的答案。請在第二個示例中的'toBeExecutedImmediately' var中爲匿名函數添加名稱(與var名稱相同,就像函數聲明一樣)*。 –

1

你可以寫排序 「功能建設者」 像這樣的:

function DeclareAndExecute(name, func) { 
    window[name] = func; 
    func(); 
} 

用法:

DeclareAndExecute("toBeExecutedImmediately", function() { 
    //code here 
}); 

Live test case

這將使用給定名稱將該函數添加到全局window作用域並立即執行它。

+1

好吧,當然。有可能創建一些不依賴於全局功能的東西。 –

2

你可以使用一個命名空間:

// alerts "say yes" 
(window.say = function (s) { alert('say ' + s); })('yes'); 
// alerts "say something" 
say('something'); 

至於意見的答覆,這裏是如何使函數的局部:

(function(){ 
    var dontSay; 
    // alerts "don't say no" 
    (dontSay = function (s) { alert('don\'t say ' + s); })('no'); 
    // alerts "don't say anything" 
    dontSay('anything'); 
})(); 

@JoeSimmons這不是一場革命確實,但問題也不是很重要; D

+0

如果你不想要一個全局函數怎麼辦? –

+0

@JoeSimmons只需使用本地命名空間:) – leaf

+0

....真的嗎?顯然我知道這一點。如果我不想要全局函數會怎麼樣?如果我想在另一個函數的範圍內定義'say'函數呢?沒有從語言內部可訪問的名稱空間。 –