gpt4 book ai didi

javascript - 为什么内部函数的变量不会泄漏到外部作用域?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:35:27 26 4
gpt4 key购买 nike

考虑以下 JavaScript 片段:

function outer() {
var x = 10;
function inner() {
var y = 20;
}
}

显然,变量youter 的上下文中不可用。遵循 ES5 规范中的流程告诉我们,当我们进入 outer 执行上下文时会发生这种情况:

  • 我们进入一个新的执行上下文(10.4)

  • 由于它是一个函数,我们遵循 Entering Function Code (10.4.3) 中概述的步骤

    • codeF 的 [[Code]] 内部属性的值。

函数的 [[Code]] 内部属性在 Creating Function Objects (13.2) 中描述。 .它引用语法指定的FunctionBody(函数的全部内容):

function Identifier ( FormalParameterListopt ) { FunctionBody }

此时我们输入Declaration Binding Instantiation (10.5)部分并执行以下操作:

  • 为函数形参列表中的任何参数创建绑定(bind)

  • 对于代码中的每个函数声明:

    • 在函数标识符和 Function 对象之间的当前范围内创建绑定(bind)(按照 Function Definition (13) 中指定的方式创建)

    • 没什么可说的“从代码中删除我们刚刚处理的函数”

  • arguments 对象创建绑定(bind)

  • 对于代码中的每个变量声明:

    • 在当前范围内为变量标识符创建一个绑定(bind)

我的问题是,为什么此时不为内部函数的变量声明创建绑定(bind)?看起来 代码 应该仍然包含外部函数的整个源文本(这将包括内部函数的源文本)。我正在寻找规范中解释行为的内容。


已更新,更清晰:我问的是当我们进入 outer 函数的上下文时会发生什么。 inner 函数永远不会被调用,我不关心当我们从 outer 函数返回时会发生什么。我纯粹对在进入新的执行上下文时为变量声明创建绑定(bind)的过程感兴趣,正如规范所定义的那样。

最佳答案

你的思路有问题。

Javascript 具有函数作用域。因此,每个函数都有一个新的执行上下文,没错。但是,在您从函数返回后,此函数上下文就会过期。这就是为什么在返回后无法从内部函数访问变量的原因。您仍然处于外部函数的执行上下文中,但无法再访问内部函数的执行上下文。

引用 spec :

Every return exits an execution context. A thrown exception may also exit one or more execution contexts.

编辑:进一步澄清:函数声明的主体未被处理(参见 10.5.5.d ),只有函数标识符和参数被传递到变量环境。

关于javascript - 为什么内部函数的变量不会泄漏到外部作用域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12618553/

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