我知道,這可以爲匿名函數執行命名函數聲明之後
(function toBeExecutedImmediately() {
// Code
}());
我有,我想在其他地方使用函數來完成,但也應立即執行。是否可以用一條語句代替?返回值是不需要的。
function toBeExecutedImmediately() {
// Code
};
toBeExecutedImmediately();
我知道,這可以爲匿名函數執行命名函數聲明之後
(function toBeExecutedImmediately() {
// Code
}());
我有,我想在其他地方使用函數來完成,但也應立即執行。是否可以用一條語句代替?返回值是不需要的。
function toBeExecutedImmediately() {
// Code
};
toBeExecutedImmediately();
是否有可能有一個說法,而不是下面做呢?
號正如您看到的,指定的函數表達式(你的第一個例子)名稱不添加到包含範圍(除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
來調用它。 (你可以在這裏使用一個命名函數表達式太,但當然,這會破壞目標 —沒有重複的名字 —據我所知)。
旁註:你的第一個例子是不是「一個匿名功能「。該函數有一個專有名稱,它是一個名爲函數表達式的。只是使用命名函數表達式,與函數聲明不同,該名稱不會添加到包含範圍中。
我不知道*破碎引擎*部分,這很有趣! – xiankai
@xiankai:是的,IE8和更早的**真的**得到命名函數表達式錯誤,詳細信息:http://blog.niftysnippets.org/2010/09/double-take.html他們實際上創建兩個不同的函數,在不同的倍。 –
這是一個很好的答案。請在第二個示例中的'toBeExecutedImmediately' var中爲匿名函數添加名稱(與var名稱相同,就像函數聲明一樣)*。 –
你可以寫排序 「功能建設者」 像這樣的:
function DeclareAndExecute(name, func) {
window[name] = func;
func();
}
用法:
DeclareAndExecute("toBeExecutedImmediately", function() {
//code here
});
這將使用給定名稱將該函數添加到全局window
作用域並立即執行它。
好吧,當然。有可能創建一些不依賴於全局功能的東西。 –
你可以使用一個命名空間:
// 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
如果你不想要一個全局函數怎麼辦? –
@JoeSimmons只需使用本地命名空間:) – leaf
....真的嗎?顯然我知道這一點。如果我不想要全局函數會怎麼樣?如果我想在另一個函數的範圍內定義'say'函數呢?沒有從語言內部可訪問的名稱空間。 –
第一個不是一個匿名函數。它有一個名字。 – Joren
你已經解決了,你只需要嘗試一下。 – Theraot
@wared:不,名稱'toBeExecutedImmediately'不會被添加到包含的範圍,因此它在其他地方不可用。 –