let和var的區別1 存在塊作用域

2021-10-21 00:09:17 字數 997 閱讀 7445

es6 新增了let命令,用來宣告變數。網上看到很多說的let和const存在塊作用域,一直就只記得這句話,不知道具體**中的怎麼回事,今天看到阮一峰老師的部落格,中的乙個例子,才覺得深有體會。

a // referenceerror: a is not defined.

b // 1

這個由let定義的變數a,只在其括號的作用域內有效,作用域之外引用則會報錯。下面這個也是如此:

for (let i = 0; i < 10; i++) 

console.log(i);

// referenceerror: i is not defined

比較重要的是下面這個**:

var a = ;

for (var i = 0; i < 10; i++) ;

}a[6](); // 10

最後函式a[6]得到結果是10,難道不該是6嗎?我自己也執行了,結果沒錯,就是10。

阮一峰老師的解釋:上面**中,變數i是var命令宣告的,在全域性範圍內都有效,所以全域性只有乙個變數i。每一次迴圈,變數i的值都會發生改變,而迴圈內被賦給陣列a的函式內部的console.log(i),裡面的i指向的就是全域性的i。也就是說,所有陣列a的成員裡面的i,指向的都是同乙個i,導致執行時輸出的是最後一輪的i的值,也就是 10。

我的解釋:因為var定義的變數在全域性有效,那麼在第一次迴圈時,i=0,函式a[0]會輸出0,a[6]則會輸出6。。。以此類推,但是注意,a是函式,除非你呼叫才會console.log輸出,但是這個0-9的迴圈是會進行的,,最後一次i=9迴圈後實現i自加,這時i=10,注意每次迴圈它都改變的是全域性的i,此時i已經為10了,呼叫a[6]這個函式,輸出為10。

還有個要注意的,由於for迴圈並不是乙個函式體,所以for迴圈中定義的函式a[i]是作用域for迴圈所在的函式體,和a6同級,不存在塊級作用域,因此可以呼叫for裡面的函式。

let 和 var 的區別

1 作用域只侷限於當前 塊 if true console.log str console.log str1 str1 is not defined2 let宣告的作用於不會被提公升 console.log str var str 1 console.log str1 str1 is not def...

var和let的區別

在es6中新增了let命令,用來宣告變數。它的用法類似於var,但是所宣告的變數,只在let命令所在的 塊內有效。let let所在的區域會形成塊級作用域 let不存在變數提公升的情況 let會形成暫時性的死區 不可以在同一作用域下重複宣告變數 var 在es6之前 都是用var 宣告變數,只有函式...

var 和 let 的區別

var 和 let 都是存在 函式作用域以及全域性作用域的 但是 let 多了乙個 塊級作用域 而 var 則可以對同乙個變數重複多次定義,每次定義取最新值 函式作用域 指的是,在函式裡面定義的變數只能在函式裡面使用,出了函式外面就undefined 全域性作用域 指的是,在全域性範圍下定義 不在函...