簡體   English   中英

Javascript-子塊中的變量重新傳送//變量陰影

[英]Javascript - variable re-delcaring in the sub-block // Variable Shadowing

我試圖了解Javascript如何處理當前作用域子塊中的let變量的重新聲明。

let-JavaScript | MDN說:

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變量作用域和提升

在JavaScript中,可以在多層嵌套作用域中指定具有相同名稱的變量。 在這種情況下,局部變量優先於全局變量。 如果聲明具有相同名稱的局部變量和全局變量,則在函數中使用局部變量時將優先使用該局部變量。 這種行為稱為陰影。 簡而言之,內部變量遮蓋了外部變量。

還有這里:

https://stackoverflow.com/a/11901489/6375464

在計算機編程中,當在某個范圍(決策塊,方法或內部類)中聲明的變量與在外部范圍中聲明的變量具有相同的名稱時,就會發生變量陰影。 據說這個外部變量被遮蓋了...

暫無
暫無

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

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