gpt4 book ai didi

javascript - JS 中的词法作用域

转载 作者:行者123 更新时间:2023-12-03 07:18:43 25 4
gpt4 key购买 nike

我通过阅读一本书(Ethan Brown 的 Learning JavaScript)来学习 JS,作者写道:

Lexical scoping means whatever variables are in scope where you definea function from (as opposed to when you call it) are in scope in thefunction. Consider this example:

const x = 3;

function f() {
console.log(x); // this will work
console.log(y); // this will cause a crash
}
const y = 3;
f();

The variable x exists when we define the function f , but y doesn’t.Then we declare y and call f , and see that x is in scope inside thebody of f when it’s called, but y isn’t. This is an example of lexicalscoping: the function f has access to the identifiers thatwere available when it was defined, not when it was called

当我在 VS Code 调试器中运行它时,似乎没有任何错误。

我明白了

3

3

无一异常(exception)。这是否取决于我使用的 ES 版本或其他?

最佳答案

虽然我认为作者只是选择了一段糟糕的(嗯,不正确的)代码来说明这一点,但这段代码很有趣,可以用来说明一些相关但又不同的东西。因为 y 是用 const 声明的,所以它在函数内部是可见的,因为它的声明被提升到最近的封闭 block (这在发布的代码中没有明确可见,但它一定在某个地方)。但是,如果将函数调用移动到该声明的之前,您看到一个错误,因为对y 的引用将以有点奇怪的方式发生-命名为“时间死区”。对使用 letconst 创建的已声明但未初始化的变量的引用是运行时错误。

如果 y 的声明更改为 var 声明,则将函数调用移至变量声明之前不会导致错误,因为该变量已定义并且在范围,但只是(老派)未初始化,因此只是未定义

关于javascript - JS 中的词法作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53163610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com