Javascript let和const
在 ES6 之前,JavaScript 只有两种作用域:
全局变量 : 在函数外声明的变量作用域是全局的
局部变量(函数变量):在函数内声明的变量作用域是局部的
<script type="text/javascript">var a = "aaa";console.log(a) // aaafunction myFunction() {var b = "bbb";console.log(a) // aaaconsole.log(b) // bbb// 这里也可以使用 carName 变量}console.log(b) // 报错</script>
块级作用域:
1) 块级作用域不影响var声明的变量。使用 var 关键字声明的变量不具备块级作用域的特性,它在 {} 外依然能被访问到。
{ var x = 2;
}
console.log(x) // 2let 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 initializationlet 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"}; // 错误