gpt4 book ai didi

JavaScript 范围和执行上下文

转载 作者:搜寻专家 更新时间:2023-11-01 04:19:21 24 4
gpt4 key购买 nike

我正在尝试理解 JavaScript 作用域规则。我在教科书和文档中读到的内容令人困惑。

在我看来,JavaScript 是一种静态(或词法)范围的语言 - 当尝试将变量名绑定(bind)到变量(定义)时,会使用代码的词法结构。

执行上下文似乎类似于调用堆栈上的堆栈帧。每个执行上下文都有一个变量对象,所有(关联函数的)局部变量都定义在该变量对象上。这些变量对象链接在一起,以提供从堆栈顶部的变量对象到堆栈底部的变量对象(窗口对象)的“作用域链”。在将变量名绑定(bind)到变量时,从上到下搜索此作用域链。这与 C/C++/Java 等静态作用域语言非常相似。

C/C++/Java 似乎有一个重要的区别——可以访问函数中定义的变量,其堆栈帧不再位于调用堆栈中,如下例所示:

var color = "red";
var printColor;

function changeColor() {
var color = "green";

printColor = function(msg) {
alert(msg + color);
}
printColor("in changeColor context, color = "); // "green"
}

changeColor();

// stack frame for "changeColor" no longer on stack
// but we can access the value of the variable color defined in that function

printColor("in global context, color = "); // "green"

我做对了吗?还有其他我应该注意的问题吗?

提前致谢

最佳答案

这确实是 C/C++ 和 JavaScript 之间的主要区别:JavaScript 是一种引用计数、垃圾收集的语言,这意味着对象可以当它们不再有任何对它们的引用时,由引擎回收。您分配给 printColor 的函数本身不在堆栈上,因为它将使用 C 或 C++;它是动态分配的,然后分配给当前范围之外的变量。所以,当控制流从changeColor,匿名函数的引用计数仍然是1因为外部 printColor 引用它,因此它可以从外部使用范围。

因此,您的示例并不是一个范围界定问题——很明显您声明了printColor changeColor 的函数范围内。当你定义changeColor, 它 closes升值printColor 进入新的功能范围,使其可访问。喜欢Combat 说,如果你在第二个内部定义中添加一个 varprintColor,它会 shadow首先printColor 您声明的并且在该函数之外无法访问它 block 。

至于其他需要注意的问题,是的,有很多,但是请看我的评论您的原始帖子以获得良好的开端。

关于JavaScript 范围和执行上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11148353/

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