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]
上一篇下一篇

猜你喜欢

热点阅读