![](/img/trans.png)
[英]Javascript: var myFunc = function() vs. var myFunc = function myFunc()
[英]Should myFunc = function(){} evaluate right away in Javascript?
如果我錯了,請發表評論:在我的記憶中,我認為兩種函數創建方式的區別:
function myFunc(){};
和
myFunc = function(){};
是第一個立即評估,后者等待函數調用。
所以我在這篇文章中得到了關於全局變量附加到window對象的代碼:
function setGloabalVariable(){
window.variable = '1';
}
加載頁面后,為什么變量仍未定義?
這兩種聲明之間的區別在於第一種是命名函數語句 ,第二種是匿名函數表達式 。 它們都不會在聲明時自動執行(你可能會想到IIFE)。
// Create a symbol named "my_named_function"
// that points at the named function "my_named_function"
function my_named_function() {
}
// Create a symbol named "my_anonymous_func"
// that points to the *unnamed* function <anonymous function>
var my_anonymous_func = function() {
}
my_named_function
和my_anonymous_func
執行。 兩者都可以通過調用它們來執行:
my_named_function();
my_anonymous_func();
IIFE(立即執行的函數表達式)的工作方式略有不同:
(/* define a function */ function() {
})(/* and *immediately* execute it */);
我建議閱讀kangax關於函數表達式和語句的優秀文章,以獲取有關此主題的更多信息。
function myFunc(){}
是一個全局函數文字,它不會立即“運行”,但可以向前和向后引用。 含義:
myFunc(); // this will run
function myFunc(){}
如:
myFunc(); // this will **not** run
myFunc = function (){}
與第二個函數的區別在於,即使你沒有聲明var myFunc =
那里。 它變成一個全局變量(也稱為內聯匿名函數),與全局內聯函數不同,因為它必須高於sometihng(向后引用)才能被使用。
function setGloabalVariable(){
window.variable = '1';
// this could have been written
// variable = '1'; var variable = '1';
// unless this function is called in some global scope, the closure won't
// bring out this variable
}
一個匿名函數立即運行,我認為這是你正在考慮的(但在你的OP中沒有)。
(function () { }());
匿名函數創建了本地/內部范圍。 非常適合創建名稱空間,並遠離全局名稱空間。
命名函數在編譯時創建並分配,因此它在代碼開始運行之前存在。 例:
x(); // This works, as the function below already exists
function x() {}
可以在編譯時創建匿名函數(取決於實現),但是在運行時將值賦給變量。 例:
x(); // This doesn't work, as the value is not assigned yet
x = function(){};
x(); // Here it works
在這兩種情況下,您必須實際調用要執行的函數內的代碼的函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.