簡體   English   中英

應該在Javascript中立即評估myFunc = function(){}嗎?

[英]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_functionmy_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM