[英]Javascript - variable re-delcaring in the sub-block // Variable Shadowing
我試圖了解Javascript如何處理當前作用域子塊中的let變量的重新聲明。
let
聲明的變量的作用域在定義它們的塊以及任何包含的子塊中。
如果我們嘗試這樣做,它可以按預期工作:
function letTest() {
let x = 1;
for(var i = 0; i < 1; i++) {
console.log(x); // logs - 1
}
}
另一個例子。 現在,我使用for
子塊分配一個新值, let
變量0
進入for
循環。 以及按預期工作。
function letTest() {
let x = 5;
console.log(x); // logs – 5
for( x = 0; x < 12; x++) {
console.log(x); // logs – 0, 1, 2, 3, 4, 5, 6, … 10, 11
}
console.log(x); // logs - 12
}
但是,當我們在for
子塊中使用關鍵字let
來重新聲明並將新值分配給相同的變量x
時會發生什么:
function letTest() {
let x = 5;
console.log(x); // logs – 5
for( let x = 0; x < 12; x++) {
console.log(x); // logs – 1, 2, 3, 4, 5, 6, … 10, 11
}
console.log(x); // logs - 5
}
這里有什么機制在起作用,究竟發生了什么?
為什么let x = 5
的值沒有改變,為什么現在有2個同名的let
變量?
let語句創建一個塊范圍變量。
function letTest() {
let x = 5;
console.log(x); // x = 5 (same 'x')
for(let x = 0; x < 12; x++) {
console.log(x); // x = 1, 2, …, 10, 11 (different 'x')
}
console.log(x); // x - 5 (same 'x')
}
而var語句創建函數作用域變量。
function varTest() {
var x = 5;
console.log(x); // x = 5
for(var x = 0; x < 12; x++) {
console.log(x); // x = 1, 2, …, 10, 11
}
console.log(x); // x = 12 ('x' from the for-loop)
}
我誤讀了您的問題,因此刪除了以前的答案。
嘗試在瀏覽器中運行以下功能(最好使用chrome開發工具):
function letTest() {
debugger;
for(var i=0; i<2; i++) {
//some code here
}
}
在調試器步驟中,即使var最初是在for循環中定義的,var也會顯示為“ i = undefined”。 這是因為它的作用域是執行上下文,在這種情況下是函數letTest。 由於此處可用,因此在for循環塊之后也將可用。
function letTest() {
debugger;
for(let i=0; i<2; i++) {
//some code here
}
}
在調試器步驟中,i不可用,因為它的作用域為for循環的塊(及其子塊)。
function letTest() {
let i=100
for(i=0; i<2; i++) {
//some code here
}
}
由於let在其自己的塊和子塊(可能是for循環)中可用,因此其初始值從100更改為0,然后在for循環完成后更改為2。
function letTest() {
let i=100
for(let i=0; i<2; i++) {
//some code here
}
}
由於您是在塊中重新聲明let,因此如上第二個示例所示,此處的“ i”將具有塊作用域。 由於它具有塊作用域,因此在塊外部不可用。
我相信我在這里找到了答案:
在JavaScript中,可以在多層嵌套作用域中指定具有相同名稱的變量。 在這種情況下,局部變量優先於全局變量。 如果聲明具有相同名稱的局部變量和全局變量,則在函數中使用局部變量時將優先使用該局部變量。 這種行為稱為陰影。 簡而言之,內部變量遮蓋了外部變量。
還有這里:
https://stackoverflow.com/a/11901489/6375464
在計算機編程中,當在某個范圍(決策塊,方法或內部類)中聲明的變量與在外部范圍中聲明的變量具有相同的名稱時,就會發生變量陰影。 據說這個外部變量被遮蓋了...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.