Javascript let和const
在 ES6 之前,JavaScript 隻有兩種作用域:
全局變量 : 在函數外聲明的變量作用域是全局的
局部變量(函數變量):在函數内聲明的變量作用域是局部的
<script type="text/javascript">
var a = "aaa";
console.log(a) // aaa
function myFunction() {
var b = "bbb";
console.log(a) // aaa
console.log(b) // bbb
// 這裡也可以使用 carName 變量
}
console.log(b) // 報錯
</script>
塊級作用域:
1) 塊級作用域不影響var聲明的變量。使用 var 關鍵字聲明的變量不具備塊級作用域的特性,它在 {} 外依然能被通路到。
{
var x = 2;
}
console.log(x) // 2
let i = 5;
for (let i = 0; i < 10; i++) {
// 一些代碼...
}
console.log(i); // 5
2)let
a) 聲明的變量隻在所處于的塊級有效
b) let沒有‘變量提升’的特性,而是‘暫時性死區(temporal dead zone)’特性。
function func(args){
if(true){
console.log(i); // Cannot access 'i' before initialization
let i = 6;
console.log(i); // 6
}
console.log(i); // i is not defined
};
func();
一個經典例子:
var arr = [];
for(var i = 0; i < 2; i++){
arr[i] = function(){
console.log(i);
};
};
arr[0](); // 2
arr[1](); // 2
'use strict';
var arr = [];
for(let i = 0; i < 2; i++){
arr[i] = function(){
console.log(i);
};
};
arr[0](); // 0
arr[1](); // 1
3) const
a) 聲明的變量隻在所處于的塊級有效
b) const是用來聲明恒定變量的,聲明的同時就必須指派,否則會報錯。
const 定義的變量并非常量,并非不可變,它定義了一個常量引用一個值。使用 const 定義的對象或者數組,其實是可變的。
// 建立常量對象
const car = {type:"Fiat", model:"500", color:"white"};
// 修改屬性:
car.color = "red";
// 添加屬性
car.owner = "Johnson";
不能對常量對象重新指派:
const car = {type:"Fiat", model:"500", color:"white"};
car = {type:"Volvo", model:"EX60", color:"red"}; // 錯誤