关于JavaScript的变量和函数提升

第一种理解方式:let和const不能被使用,直到他们被声明

对于var定义的变量,解析器会提升其到作用域顶部。

// Outputs: undefined
console.log(x);

var x = "Now it's defined!";

// Outputs: "Now it's defined!"
console.log(x);

对于let定义的变量,在声明之前使用这些变量,就会报错。

"use strict";

// ReferenceError
console.log(x);

let x = "Now it's defined!"; 

console.log(x);

另外ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

"use strict";

let x = 10;

if (true) {
    "use strict";

    // ReferenceError
    console.log(x);

    let x = 20;

    console.log(x);
}

对于函数声明,解析器会提升并定义到作用域顶部。

// Outputs: "Definition hoisted!"
f();

function f() {
    console.log("Definition hoisted!");
}

第二种理解方式

所有的定义方式“var, let, const, function, function, class”都存在变量提升,但是var定义的变量被提升初始化为undefined, function/function的变量被提升并被定义相应函数;而let, const, class定义的变量被提升,但没有被初始化,且只能在声明的时候被初始化,不然提前的引用都会报ReferenceError错误。

参考

posted @ 2016-02-19 11:58  杨琼  阅读(162)  评论(0编辑  收藏  举报