let 與 var 的區別
阿新 • • 發佈:2020-07-19
let 是 es6.0 新增的定義變數的方式,用來宣告區域性變數,用法類似於 var 但也有區別
-
定義塊級作用域變數
{ var i=0; } console.log(i);//0
{} 無法限定 var 定義的變數的訪問範圍
{ let i=0; } console.log(i); //Uncaught ReferenceError: i is not defined
{} 能限定 let 定義的變數的訪問範圍
-
解決閉包問題共用父級作用域的問題
function test(){ var arr = [] for(var i=0;i<10;i++){ //執行到最後 i = 10 arr[i] = function(){ //這裡只是函式的定義,並不會取存 i 的值 console.log(i); } } return arr; } var myArr = test(); for(var j=0;j<10;j++){ myArr[j](); //10個10 }
被儲存到外部的10個函式共用一個父級作用域
function test(){ var arr = [] for(let i=0;i<10;i++){ arr[i] = function(){ console.log(i); } } return arr; } var myArr = test(); for(var j=0;j<10;j++){ myArr[j](); //0-9 }
let定義的變數每次執行都是一個全新的作用域,被儲存到外部的10個函式有10個不同的作用域
-
let 變數預編譯不會提升
console.log(i) var i=0 //undefined
var 定義的變數預編譯階段會宣告提升
console.log(i) let i=0 //Uncaught ReferenceError: Cannot access 'i'
let 定義的變數不會提升
-
let 變數不能重複宣告
var i=0; var i=1;
var 重複宣告並不會報錯
let i=0; let i=1; //ncaught SyntaxError: Identifier 'i' has already been declared
let 重複宣告報錯