簡體   English   中英

在嵌套函數中使用var來聲明一個與parent參數同名的變量

[英]Using var in a nested function to declare a variable with the same name as a parameter of parent

我正在使用JavaScript編寫一些代碼並發現了一個意外的行為。

我在f里面使用嵌套函數g f有一個名為m的參數。 當在g使用和聲明一個具有相同名稱的變量時,會發生一些奇怪的事情:

var f = function(m) {
    var g = function() {
        alert(m);
        var m = 0;
    };
    g();
};
f(1);

這段代碼將導致undefined ,而不是我期望的1

var行下面移動alert語句將導致答案0有意義。

我想這是因為JavaScript只使用函數作為名稱閉包, var m將通過聲明附加到函數g ,但是在alert時尚未分配m

但我不確定這一點,因為如果函數沒有嵌套,那么行為對我來說很好看:

var g = function(m) {
    alert(m);
    var m = 0;
};
g(1);

會產生1

誰能解釋一下? 謝謝。

Javascript使用函數范圍,這意味着變量的范圍不像C的塊范圍根據{}進入和超出范圍,而是由函數的開頭和結尾進入和超出范圍。 因此,您在函數中定義的每個局部變量都是從該函數的執行開始聲明的,並且在您在函數中初始化之前將是undefined類型。

因此,當g執行時,由於它將在某個時刻創建局部變量m ,運行時已經聲明存在一個局部m (顯然隱藏了f函數的外部m),其類型是g '的開頭 undefined 的執行

請參閱https://developer.mozilla.org/en/JavaScript/Reference/Scope_Cheatsheet ,它解釋了當您執行var varName它將變量提升到函數范圍的頂部。 該頁面有很多很好的例子,這里有一個總結它的引用:

變量的每個定義實際上都是其范圍頂部的變量聲明 ,以及定義所在位置賦值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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