CPPAlien / JS-QA

前端知识问答
0 stars 0 forks source link

提升(Hoisting) #21

Open CPPAlien opened 4 years ago

CPPAlien commented 4 years ago

提升(Hoisting)是 JavaScript 将声明移至顶部的默认行为。 是 js 编译时的一种行为。

greeting();
// Hello!

function greeting() {
    console.log("Hello!");
}
greeting();

// Uncaught TypeError: greeting is not a function
// 因为 var 会被申明提升,但不会提升赋值。此时 greeting 是个 undefined 的值
var greeting = function greeting() {
    console.log("Hello!");
};

// Uncaught ReferenceError: Cannot access 'greeting' before initialization
// let 不会提升,直接报引用错误
let greeting = function greeting() {
    console.log("Hello!");
};
CPPAlien commented 4 years ago

var 可以重复声明。 而 let 和 const 不可以,会报语法错误。

Uncaught SyntaxError: Identifier 'xxx' has already been declared
CPPAlien commented 4 years ago

Each loop iteration is its own new scope instance, and within each scope instance,

for (const index in students) {
    // this is fine
}

for (const student of students) {
    // this is also fine
}

for (const i = 0; i < 3; i++) {
    // oops, this is going to fail
    // after the first iteration
} // 等价于下面这种形式,所以出错了
{
    const $$i = 0;  // a fictional variable for illustration

    for ( ; $$i < 3; $$i++) {
        const i = $$i;   // here's our actual loop `i`!
        // ..
    }
}
CPPAlien commented 4 years ago

ReferenceError

console.log(xxx);
let xxx = "Suzy";
Uncaught ReferenceError: Cannot access 'xxx' before initialization

Temporal Dead Zone 语义禁止在未声明之前访问变量。它强调了这样的规则:不要在未声明前使用任何东西。

TDZ是一个重要的概念,它影响着const、let 和 class 语句的可用性。它不允许在声明之前使用变量。

Screen Shot 2020-02-01 at 9 30 46 PM