问题标签 [scope-chain]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
132 浏览

javascript - 最小化作用域链的长度会提高性能吗?

背景

我经常使用模块模式来组织我的代码,以便函数和常量在需要知道的基础上运行。如果CONSTANTorsomeFunc仅由 使用anotherFunc,那么我将 的定义包含anotherFunc在一个匿名函数中,这样前两者就不会污染全局范围。这有助于避免名称冲突,还可以让您保证稍后查看代码取决于什么。

不过,这种策略确实会创建许多闭包,我想知道显式传递这些依赖项是否会更好地提高性能(并且也更易于维护)。我认为这具有最小化函数必须遍历以查找变量的作用域链的效果。

只是为了允许对模块模式本身的反馈,我包含了三个版本:1)没有模块模式,2)有它,3)有它和范围链最小化。

没有模块模式

使用模块模式,但没有范围链最小化

使用模块模式和范围链最小化

概括

哪个版本应该有更好的性能(为什么)?性能差异是否显着?(即作用域链查找是否昂贵?)内存使用情况如何?(即通过传入变量,我本质上是在复制范围,对吗?)

0 投票
1 回答
101 浏览

javascript - 返回内部函数时,javascript如何保留外部函数的执行上下文?

我正在阅读这两个博客: David Shariff 发表的执行上下文和作用域深入探讨了 javascript 的执行上下文和作用域链概念。

阅读上述博客后,我不清楚的一件事是 javascript 如何防止父函数的执行上下文被垃圾收集?

让我们看以下非常简单的代码:

当外部函数被调用时,我们得到一个指向内部函数的指针。所以在这个阶段,内部函数被创建/定义,但还没有被调用。

根据博客,只有在调用函数时,才会建立作用域链。所以在调用内部函数之前,我认为没有指针引用外部函数的执行上下文。那么js引擎如何防止外部函数的执行上下文被垃圾回收呢?

0 投票
2 回答
55 浏览

javascript - with里面的哪些变量对象语句被绑定?

我正在研究 N. Zakas 的“Professional JavaScript for Web Developers”,我遇到了这个片段。据我了解with,这是一个通过将location对象推到前面来增加范围链的语句。

似乎将url局部变量分配给函数激活对象。为什么不分配给location?

0 投票
2 回答
62 浏览

javascript - Javascript 对象中的作用域

当我执行此代码时

我得到输出为“你好”。但我无法弄清楚为什么会这样。根据我所阅读的内容,范围链在定义期间相互堆叠,最后一个范围块附加在它们之上的运行时。那么作用域链不应该像- global -> function f -> ret Object -> function test 吗?为什么 ret 对象的成员被排除在范围链之外?是不是对象的成员不附加到范围而只是上下文的一部分?

0 投票
0 回答
15 浏览

javascript - 返回函数的作用域链中不存在直接父函数

我一直在对函数对象的 [[scope]] 属性进行一些研究。[[scope]] 除了全局对象之外,还应该包含所有外部函数的变量对象。

在这里,从函数返回的最里面的Inner函数应该包含分配给它的作用域链的两个Inner+Outer+Global变量对象。但它只有Outer+Global分配给它的作用域链的变量对象。

为什么Inner返回函数的 [[scope]] 链中没有函数,而返回函数恰好是返回函数的直接父级。对这种行为有什么合适的解释吗?

结果 :

在此处输入图像描述

0 投票
1 回答
60 浏览

javascript - 为什么函数 B 的执行上下文不将其激活对象传递给函数作为作用域链对象,即 A 可以访问 B 的变量

嗨伙计们感谢您阅读我的问题。所以我从 2 天开始就在研究这个问题,但没有找到任何答案,所以感谢您的帮助。所以这里是下面的代码:

所以在这里,如果我运行这段代码,函数 A 会得到一个错误消息:“myVar is not defined”,因为它无法访问函数 B 的变量,这是我不理解的。

据我所知,当代码开始运行时,全局执行上下文将由 javascript 引擎创建,并且每次引擎遇到函数调用的括号 - 并且满足其他一些条件 - 时,javascript 都会创建一个执行上下文对象对于已调用的函数。

它应该包括作用域链、激活对象和“this”关键字和 在作用域链中应该是父执行上下文的所有变量/激活对象

因此,换句话说,其作用域链对象中的函数 A 应该具有函数 Bs 所有变量(但显然情况并非如此,这是我不明白的)。

但是如果我运行这段代码,其中函数 As 定义嵌套在函数 B 中:

所以现在函数 A 将可以访问在函数 B 中声明和初始化的变量。

但在我看来,函数 A 的定义位置并不重要,因为它是在函数 B 的上下文中调用的。

即使 this 关键字值是在创建阶段定义的,它的值也将基于函数的调用位置和方式,而不是定义的位置。

谢谢你们的阅读给我带来了大量的文字,我真的很感激。并感谢每一个答案或任何类型的文章或材料,这可以帮助我理解这个异常。

干杯,非常感谢。

0 投票
2 回答
434 浏览

javascript - 对于完整代码或嵌套函数级别是否立即进行提升

嘿伙计们。我不明白关于吊装的一些事情,这可能是我的错,但我没有找到任何答案,无论是在这里还是在谷歌上,这就是我问的原因,感谢阅读。

所以我不明白,当 javascript 引擎在下面获取我的代码并开始扫描时,是否会抛出具有扫描的所有函数和嵌套函数的整个代码,直到最后一个范围?并且所有函数的创建阶段都将在第一次扫描时进行(或者换句话说,完整的代码是否会被扫描一次并为每个函数准备好一切)?

或者提升是逐层嵌套的?所以我的意思是首先将提升在全局上下文中定义的那些功能?然后当其中一个函数被调用并且它的执行上下文执行阶段开始时,它的嵌套函数会被提升吗?

我正在调查这个问题,因为我真的不了解嵌套函数是如何记住的,它是在哪个词法环境/函数中定义的,如果它至少没有被提升,它有一个 [[Scopes]] 属性,它保留它的范围链

问题是我到目前为止看到的所有文章,甚至 ecmascript 6 文档也只说,如果扫描仪满足函数定义a,那么会发生提升,然后范围属性将使用范围链和变量对象创建,参数对象和“this”关键字,但我没有找到任何可以谈论的材料,如果嵌套函数(保存在变量对象中,并在那里加上对其在内存中的函数体的引用)至少也会被提升(同时,他们的父函数被提升)并且他们得到一个作用域链来记住他们的外部环境,如果他们从那里被外部环境调用

非常感谢阅读我的大量文字,如果你能回答它或者如果你有一篇关于这方面以及提升的文章,我真的很感激

0 投票
2 回答
42 浏览

javascript - 使用 JavaScript 的 with(){} 语句时,无效变量会去哪里?

当使用 JavaScript 的 with 语句时,具有无效名称的变量会去哪里?

你也可以引用 JavaScript 引擎中的代码吗?

0 投票
5 回答
63 浏览

javascript - 从事件函数更改全局变量

我正在尝试学习 Javascript。

我在 Youtube 上观看了一些 Javascript 课程,并正在尝试创建我的第一个项目。

项目应该是简单的井字游戏。

功能:第一次单击框应填“X” 第二次单击另一个框应填“Y” 第三次单击另一个框应再次填“X”以此类推,直到所有框都填满字符。

有我的代码 HTML

CSS

Javascript

还有项目链接 - https://jsfiddle.net/qwy2k571/

目前每个框都用“X”填充。我知道我并不完全理解闭包和作用域链,但请给我一个正确的代码以通过示例来理解它。

提前致谢并致以最诚挚的问候。

0 投票
1 回答
74 浏览

javascript - Javascript范围链继承

我是一名学习编程的学生。

我有个问题。

如果我想在 myObj 中使用 a 的方法,我们使用这段代码。

这意味着改变作用域链的目标。但是我们为什么不使用这段代码呢?

我认为创建和使用新对象一定是有原因的。但我不知道。请教我。谢谢你。