let的介紹
let是ES6新增的命令。 作用:宣告變數。 類似於:var。 與var的區別:使用let宣告的變數,只在其所在的程式碼塊內有效。
定義回顧
宣告變數:可以用var,也可以不用var。 是否允許變數提升:允許。 是否允許重複宣告同一個變數:允許。 變數的作用域:全域性作用域、函式作用域。 在全域性作用域中,無論是否使用var,定義的變數都是全域性變數。 在函式作用域中,使用var定義函式區域性變數,不使用var定義全域性變數。 全域性變數全域性可用,函式區域性變數在函式內可用。 程式碼塊:用{}栝起來的程式碼片段。
基本語法
let宣告的變數,只在其所在其所在的程式碼塊內有效。 let不存在變數提升。 let不允許重複宣告。 let不允許在函式的一級作用域內重新宣告引數。 let存在的塊級作用域,它宣告的這個變數或“繫結”這個區域,形成“暫時性死區”,使其不再受外部影響。 就是說,一個變數,無論其在外部是否宣告,只要在某個塊級作用域內使用let重新宣告瞭,那麼在這個塊級作用域內該變數在宣告前是不可以使用的。
使用場景
for迴圈的計數器 let宣告的迴圈變數i只在本輪迴圈有效,每一次迴圈的i都是一個新變數。特別的JavaScript引擎內部會記住上一輪迴圈的值,初始化本輪的變數i時,是在上一輪迴圈的基礎上進行計算。 另外,for迴圈設定迴圈變數的那部分是一個父作用域,而迴圈體內部是一個單獨的自作用域。
程式碼片段
part 1:var宣告變數回顧
<script type="text/javascript">
var a = 1;
console.log(a); // 1
b = 2;
console.log(b); // 2
console.log(c); //undefined
var c = 3;
var a = 4;
function showA(){
console.log(a);
d = 5;
console.log(d);
}
showA(); // 4,5
console.log(d); //5
function showB(){
console.log(b);
var e = 6;
console.log(e);
}
showB(); //2,6
console.log(e); //報錯
</script>
複製程式碼
part 2:let宣告的變數時區域性變數
<script type="text/javascript">
{
var a = 1;
let b = 2;
}
console.log(a); //1
console.log(b); //報錯
</script>
複製程式碼
part 3:for迴圈中使用var定義迴圈引數,該引數會變味全域性引數
<script type="text/javascript">
var a = [];
for(var i = 0; i < 10; i++){
a[i] = function(){
console.log(i);
}
}
a[6](); //10
</script>
複製程式碼
part 4:for迴圈中使用let定義迴圈引數,改引數是塊級作用域內的引數
<script type="text/javascript">
for(let i = 0; i < 10; i++){
}
console.log(i); //報錯
</script>
複製程式碼
part 5:對比part3,用var定義迴圈變數
<script type="text/javascript">
var a = [];
for(let i = 0; i < 10; i++){
a[i] = function(){
console.log(i);
}
}
a[6](); // 6
</script>
複製程式碼
part 6:for迴圈中,外層是一個父作用域,裡面的每層迴圈是一個自作用域,互不影響
<script type="text/javascript">
for(let i = 0; i < 3; i++){
let i = 'abc';
console.log(i); //abc,abc,abc
}
</script>
複製程式碼
part 7:let宣告的變數不允許變數提升
<script type="text/javascript">
console.log(a); //報錯
let a = 1;
</script>
複製程式碼
part 8:塊級作用域中用let宣告的變數會形成【暫時性死區】,即使在全域性宣告瞭該變數,也不能在let宣告前呼叫
<script type="text/javascript">
let a = 1;
console.log(a); //1
{
a = 2;
let a;
console.log(a); // 報錯
}
</script>
複製程式碼
part 9:let宣告的變數不允許重複宣告
<script type="text/javascript">
let a = 1;
console.log(a); // 1
let a = 2;
console.log(a); //報錯
</script>
複製程式碼
part 10:不允許在函式的一級作用域內使用let重新宣告引數
<script type="text/javascript">
function showName(name){
let name = 'sunny';
console.log(name);
}
showName('lily'); // 報錯
</script>
複製程式碼
part 11:可以在函式的二級或三級等作用域內使用let重新宣告引數,且與一級作用域中的引數互不影響
<script type="text/javascript">
function showName(name){
console.log(name);
{
let name = 'sunny';
console.log(name);
}
}
showName('lily'); //lily,sunny
</script>
複製程式碼