9.8 函数声明和类 声明
函数 声明……
- 块级作用域,类似
let
。 - 创建全局对象的属性(在全局作用域中),类似
var
。 - 变量提升:在作用域中的所有函数声明,都会在作用域的最顶部创建。
以下的代码演示了函数声明的变量提升:
{ // Enter a new scope
console.log(foo()); // OK, due to hoisting
function foo() {
return 'hello';
}
}
类声明……
- 块级作用域
- 不创建全局对象的属性
- 变量不提升
类变量不提升可能是令人惊讶的,因为在本质上它们创建了函数。这种行为的理由是,继承的值是通过表达式定义,并且这些表达式必须中适当的时间执行。
{ // Enter a new scope
const identity = x => x;
// Here we are in the temporal dead zone of `MyClass`
let inst = new MyClass(); // ReferenceError
// Note the expression in the `extends` clause
class MyClass extends identity(Object) {
}
}