![](/img/trans.png)
[英]Why can't use let to declare a variable using the same name as one function parameter, even the parameter get set default value?
[英]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.