1、新增let命令
a // referenceerror: a is not defined.
b // 1
有一種情況很適合用let命令:for迴圈的計數器。
for(let i =0; i下面就用乙個例子來比較一下let和var在for迴圈計數器的不同,為什麼let更適合:
var a = ;
for(var i = 0; i < 8; i++)
}a[5](); // 8
var a = ;
for(let i = 0; i < 8; i++)
}a[5](); // 5
2、只要塊級作用域內存在let命令,那麼它所宣告的變數就不再受外部的影響,形成了封閉作用域
if (true)
在let命令宣告變數tmp之前,都屬於變數tmp的"死區"。
let foo = 'outer';
function bar(func = x => foo)
bar();
func 預設是乙個匿名函式,返回值為foo,作為bar函式的引數。func的作用域不是bar,func宣告是在外層作用域,所以bar內部的foo指向函式體外的foo的值,這段**等同於下面這段**:
let foo = 'outer'
let f = x => foo;
function bar(func = f)
bar();
總之,暫時性死去的本質就是:只要已進入當前作用域,所要使用的變數就已經存在了,但是不可獲取,只有等到宣告變數的那一行**出現,才可以獲取和使用該變數。
3、新增塊級作用域
es5只有全域性作用域和函式作用域,這樣會產生很多不合理的場景。
第一種場景:內層變數可能會覆蓋外層變數
var tmp = "hello";
(function())(); //undefined
思考一下,為什麼結果會是undefined呢?
var tmp = "hello";
if(true) // hello
var tmp = "hello";
(function())(); //undefined
第二種場景,用來計數的迴圈變數洩露為全域性變數。
var s = 'hello';
for (var i = 0; i < s.length; i++)
console.log(i); // 5
變數i只是用來控制迴圈的,迴圈結束它就沒有用了,但是卻洩露成了全域性變數,這個很不好。
可以說let為js增加了塊級作用域,來看下面這段**吧:
function a()
console.log(s); //1
}
function a()
console.log(s); //3
}
let 宣告的變數,使外層的**不受內層的**影響,而var則沒有這樣的效果。
es6允許塊級作用域的任意巢狀,並且外層作用域無法讀取內層作用域的變數
console.log(s); // 報錯
}}}};
內層作用域可以定義外層作用域的同名變數
}}}};
塊級作用域可以代替立即執行函式
//立即執行函式
(function()());
//塊級作用域
es6中函式本身的作用域在其所在的塊級作用域之內
function f()
(function ()
} f();
}());
es5中的執行結果:i am inside!
es6中的執行結果:i am outside!
造成這樣結果的原因就是:
}f(); //報錯
因為函式的呼叫在塊級作用域的外部,所以無法呼叫塊級作用域內部定義的函式。
let b;
}b() // "world"
如果**進行上面這樣的處理,即把函式b的宣告與函式呼叫放在同一塊級作用域就可以了。
注:如果在嚴格模式下,函式只能在頂層作用域和函式內宣告,其他情況(比如if**塊、迴圈**塊)的宣告都會報錯。
ES6學習筆記1 let 和 const
let命令與var用法類似,用於宣告變數,區別在於其宣告的變數只在let命令所在的 塊中有效 for let i 0 i 10 i console.log i 變數i未定義在for迴圈中,設定迴圈變數的那部分是乙個父作用域,而迴圈體內部是乙個單獨的子作用域,上述i在迴圈的作用域中定義,因此在迴圈體外...
ES6學習 let和const命令
1.let命令 所宣告的變數命令所在 塊有效 a referenceerror a is not defined.b 1for迴圈的計數器,就很適合let命令 for let i 0 i arr.length i console.log i referenceerror i is not defin...
ES6學習 let和const命令
說明 本文參考阮一峰的ecmascript 6 入門 console.log a 塊外使用會報錯 referenceerror a is not defined for迴圈內使用let和var產生的不同效果 下面 使用的是var,結果為10 var a for var i 0 i 10 i a 9 ...