const let var
2019-03-10 本文已影响0人
笃笃木鱼
let
块级作用域(一般情况下是{}内)
function varTest() {
var x = 1;
if (true) {
var x = 2; // 同样的变量!
console.log(x); // 2
}
console.log(x); // 2
}
function letTest() {
let x = 1;
if (true) {
let x = 2; // 不同的变量
console.log(x); // 2
}
console.log(x); // 1
}
块级作用域特例:
for (let expr1; expr2; expr3) statement
此处 expr1; expr2; expr3和 statement在同一隐含域块
解决循环中的问题
会和闭包环境绑定
var list = document.getElementById("list");
for (let i = 1; i <= 5; i++) {
var item = document.createElement("LI");
item.appendChild(document.createTextNode("Item " + i));
let j = i;
item.onclick = function (ev) {
console.log("Item " + j + " is clicked.");
};
list.appendChild(item);
}
会依次打印出1 2 3 4 5
在程序或者函数的顶层,let并不会像var成为容器对象的属性
var x = 'global';
let y = 'global';
console.log(this.x); // "global"
console.log(this.y); // undefined
全局let不会变为窗口对象属性
MDN原文是top level of program and functiom,大部分理解为全局
暂存死区Temporal dead zone
同一作用域中,let重复定义一个变量会报错
let声明不会被提升到当前执行上下文顶部,提前引用会报错
块开始到变量用let初始化之前,这个变量处于“暂存死区”,ReferenceError
const
1.声明的同时要赋值(值不可更改)
2.块级作用域
3.无变量提升等(暂存死区)
4.全局常量不会变为窗口对象属性
var
作用域是整个封闭函数
hoisting:声明提升,赋值不会提升。
把所有的变量声明移动到函数或者全局代码的开头
可以重复声明且不会丢值
未声明的变量直接赋值
1.会隐式地声明为全局变量
2.执行赋值时,才会被创建
3.其特征值 configurable: false[ 声明的变量configurable: true]