【发布时间】:2018-11-05 23:08:45
【问题描述】:
我正在通过阅读作者写道的一本书(Ethan Brown 的《学习 JavaScript》)来学习 JS:
词法范围是指您定义的范围内的任何变量 一个函数(而不是当你调用它时)在 功能。考虑这个例子:
const x = 3;
function f() {
console.log(x); // this will work
console.log(y); // this will cause a crash
}
const y = 3;
f();
当我们定义函数 f 时,变量 x 存在,但 y 不存在。 然后我们声明 y 并调用 f ,并看到 x 在范围内 被调用时 f 的主体,但 y 不是。这是一个词法的例子 作用域:函数 f 可以访问标识符 在定义时可用,而不是在调用时可用
当我在 VS Code 调试器中运行它时,似乎没有任何错误。
我明白了
3
3
没有任何例外。这是否取决于我正在使用的 ES 版本或其他?
【问题讨论】:
-
这是一个糟糕的示例代码。作者完全错了。
-
补充@Pointy所说的,在定义和编译函数时没有分配范围,而是在运行时分配,即在调用函数时。
-
y不在f的范围内,但它被定义在封闭范围内(在本例中为全局范围),因此可以毫无问题地访问它。听起来这本书没有很好地解释范围。 (我所知道的关于 JS 作用域的最佳讨论在这本书中:github.com/getify/You-Dont-Know-JS/blob/master/…) -
这里有一个很好的例子,可以帮助你理解词法作用域。 stackoverflow.com/a/1047491/9898651
-
@Pointy 的评论应该是答案。这本书的作者犯了一个错误,没有两种方法。
标签: javascript