【发布时间】:2016-04-15 23:35:55
【问题描述】:
我正在尝试理解 ES6 词法作用域(使用节点运行时)。 考虑以下几点:
'use strict';
let x = 10;
function f() {
console.log(x);
console.log(y); // This should crash
}
let y = 5;
f();
引自 O'Reilly 的书“Learning Javascript”:
词法作用域意味着您定义函数的范围内的任何变量(与调用它时相反)都在函数的范围内。
但是,当我运行这个程序(通过节点)时,它会输出: 10 5
对console.log(y) 的调用不是在这里破坏了词法范围规则吗?如果没有,为什么不呢?
编辑:为了将来参考,教科书(Learning Javascript 3rd Edition O'Reilly)的作者最近在“已确认勘误表”中将此示例列为错误。在http://www.oreilly.com/catalog/errata.csp?isbn=0636920035534
【问题讨论】:
-
变量声明被提升到块的开头。
-
@Barmar 如果你在定义之前访问
let,你会得到一个临时死区错误。如果你反转let y = 5;和f()你会得到一个错误 - 不是undefined记录。 -
直到他调用
f(),这是在变量初始化之后,他才访问它。 -
提升是变量在内部函数范围内的原因,即使声明是在函数定义之后。
-
这也与提升无关 - 它只是在引用时检查变量的有效性这一事实 - 这恰好发生在 f 被调用时,即 在 变量是定义。例如,如果
f是一个 IIFE,代码会抛出。吊装根本不是它的正确术语。
标签: javascript node.js ecmascript-6 scoping lexical