2017-08-10 78 views
3

據我所知,'let'用於聲明塊變量。但它不能用相同的名稱聲明兩次。例如:如何理解'for'語句中的'let'?

'use strict'; 
let a = 1; 
let a = 2; // syntax error 

那麼如何在'for'迭代中用相同的變量名來區分每個作用域呢?

'use strict'; 
for(let i = 0; i < 3; i++){ 
    setTimeout(function(){ 
     console.log(i); 
    }); 
} 
// output: 
// 0 
// 1 
// 2 

劑量解釋器默默地改變變量名嗎?任何信息將不勝感激。

我不認爲是一個重複的問題。因爲我真的想問的是兩種理論之間的衝突。

+0

我不認爲是重複的。我想知道兩個原則之間的衝突。 – JamesYin

+0

您可以嘗試在[通天REPL(https://babeljs.io/repl/#?babili=false&evaluate=true&lineWrap=false&presets=es2015%2Creact%2Cstage-0&targets=&browsers=&builtIns=false&debug=false&code_lz=GYewTgFANgpgLgAgJYILwIAwG5kIDwIDMOSA1KQJQDeAsAFAKMIDO8AKkgLYwgCucEYLwB2AYzhIQwiNXpN5CUVOYhYAOiggA5hCQUscpgF999I0A運行代碼)瞭解它是如何工作的。 –

回答

0

let作用域的變量,它在。 你分配到一個a範圍後的塊,你不能覆蓋它。所以第二次使用let時,它無法處理。

正確用法是:

'use strict'; 
let a = 1; 
a = 2; 
+1

這個問題不是關於第一個代碼塊,而是它在for循環中的工作方式。 – Ivar

+1

第一個代碼是OP,聲明他明白'let'是如何工作的。他在'for'循環中要求'let'。 – yuriy636

1

在for循環中,我在它的唯一的開始,在每次迭代中改變它的值聲明。

let用於變量,您將再次寫入值。

在第一個示例中,您定義名稱爲'a'的變量,因此您不能定義另一個具有相同名稱的變量,但可以更改它的值,這發生在for循環中。

+1

不正確。正如[本答案](https://stackoverflow.com/questions/16473350/let-keyword-in-the-for-loop)中所解釋的,每次迭代'i'都會得到一個新的綁定。 – Ivar

0
'use strict'; 
let a = 1; 
let a = 2; // syntax error 

'use strict'; 
let a = 1; 
var a = 2; this will overwrite... 

這裏你指定了一個值..你的意圖是,它不應該在運行時改變。所以你不能能夠改變它一旦與同類型let塊中聲明..

就是爲什麼你收到此錯誤..

let意圖值應該不會改變..

環路

, 它將在iterate上分開..所以它在運行時打印值。所以它不會覆蓋它...

0

讓利允許一次創建變量,但變量的值是可以改變的,例如 -

 let t =5// 
    let t = 6 // throws an errow but 
    t =7 
console.log(t) - gives 7 
0

在你的第一個例子中的變量a被定義了兩次在相同的範圍內。這會給你一個錯誤,因爲這個變量已經存在。 let不允許這樣做,用var來確認。這是使用let的一個優點。

var a = 3; 
 
var a = 2; 
 

 
console.log(a); // 2 
 

 
let b = 3; 
 
let b = 2; //syntax error 
 

 
let c = 3; 
 
var c = 2; //also a syntax error

在for循環中,所述i變量具有不同的範圍。含義這兩個i變量在這裏不是相同。

let i = "my string"; 
 
console.log(i); //my string 
 

 
for(let i = 1; i <= 3; ++i){ 
 
    console.log(i); //1, 2, 3 
 
    
 
} 
 

 
console.log(i); //my string

的JavaScript運行時,如果你的變量命名爲同樣不關心。它將區分範圍,從而區分變量的參考。它將替換您對i的引用,其值爲4 for循環中的新變量。

我在Stackoverflow的here上有一個答案,它描述了Android編譯器如何不關心你的變量名。這裏是一樣的,運行時使用不同的「名稱」(不同的內存地址)。

+1

@Ivar你的權利,會馬上改變它 – Wernerson

0

在循環中變量不會再次聲明,但只會增加它的值。 它類似於以下內容:

'use strict'; 
let i = 0; 
i = i + 1; 

考慮,直到條件失敗的代碼被一次又一次的重複。

0

for(let i = 0; i < 3; i++){ // code }

步驟:

  1. let i = 0

  2. 結帳i<3

  3. EXEC code

  4. i++,等於i = i + 1 //不會發生錯誤,而let i = i + 1會發生異常

  5. 循環步驟2中,直到i<3 == false