问题标签 [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.
javascript - 最小化作用域链的长度会提高性能吗?
背景
我经常使用模块模式来组织我的代码,以便函数和常量在需要知道的基础上运行。如果CONSTANT
orsomeFunc
仅由 使用anotherFunc
,那么我将 的定义包含anotherFunc
在一个匿名函数中,这样前两者就不会污染全局范围。这有助于避免名称冲突,还可以让您保证稍后查看代码取决于什么。
不过,这种策略确实会创建许多闭包,我想知道显式传递这些依赖项是否会更好地提高性能(并且也更易于维护)。我认为这具有最小化函数必须遍历以查找变量的作用域链的效果。
只是为了允许对模块模式本身的反馈,我包含了三个版本:1)没有模块模式,2)有它,3)有它和范围链最小化。
没有模块模式
使用模块模式,但没有范围链最小化
使用模块模式和范围链最小化
概括
哪个版本应该有更好的性能(为什么)?性能差异是否显着?(即作用域链查找是否昂贵?)内存使用情况如何?(即通过传入变量,我本质上是在复制范围,对吗?)
javascript - with里面的哪些变量对象语句被绑定?
我正在研究 N. Zakas 的“Professional JavaScript for Web Developers”,我遇到了这个片段。据我了解with
,这是一个通过将location
对象推到前面来增加范围链的语句。
似乎将url
局部变量分配给函数激活对象。为什么不分配给location
?
javascript - Javascript 对象中的作用域
当我执行此代码时
我得到输出为“你好”。但我无法弄清楚为什么会这样。根据我所阅读的内容,范围链在定义期间相互堆叠,最后一个范围块附加在它们之上的运行时。那么作用域链不应该像- global -> function f -> ret Object -> function test 吗?为什么 ret 对象的成员被排除在范围链之外?是不是对象的成员不附加到范围而只是上下文的一部分?
javascript - 为什么函数 B 的执行上下文不将其激活对象传递给函数作为作用域链对象,即 A 可以访问 B 的变量
嗨伙计们感谢您阅读我的问题。所以我从 2 天开始就在研究这个问题,但没有找到任何答案,所以感谢您的帮助。所以这里是下面的代码:
所以在这里,如果我运行这段代码,函数 A 会得到一个错误消息:“myVar is not defined”,因为它无法访问函数 B 的变量,这是我不理解的。
据我所知,当代码开始运行时,全局执行上下文将由 javascript 引擎创建,并且每次引擎遇到函数调用的括号 - 并且满足其他一些条件 - 时,javascript 都会创建一个执行上下文对象对于已调用的函数。
它应该包括作用域链、激活对象和“this”关键字和 在作用域链中应该是父执行上下文的所有变量/激活对象
因此,换句话说,其作用域链对象中的函数 A 应该具有函数 Bs 所有变量(但显然情况并非如此,这是我不明白的)。
但是如果我运行这段代码,其中函数 As 定义嵌套在函数 B 中:
所以现在函数 A 将可以访问在函数 B 中声明和初始化的变量。
但在我看来,函数 A 的定义位置并不重要,因为它是在函数 B 的上下文中调用的。
即使 this 关键字值是在创建阶段定义的,它的值也将基于函数的调用位置和方式,而不是定义的位置。
谢谢你们的阅读给我带来了大量的文字,我真的很感激。并感谢每一个答案或任何类型的文章或材料,这可以帮助我理解这个异常。
干杯,非常感谢。
javascript - 对于完整代码或嵌套函数级别是否立即进行提升
嘿伙计们。我不明白关于吊装的一些事情,这可能是我的错,但我没有找到任何答案,无论是在这里还是在谷歌上,这就是我问的原因,感谢阅读。
所以我不明白,当 javascript 引擎在下面获取我的代码并开始扫描时,是否会抛出具有扫描的所有函数和嵌套函数的整个代码,直到最后一个范围?并且所有函数的创建阶段都将在第一次扫描时进行(或者换句话说,完整的代码是否会被扫描一次并为每个函数准备好一切)?
或者提升是逐层嵌套的?所以我的意思是首先将提升在全局上下文中定义的那些功能?然后当其中一个函数被调用并且它的执行上下文执行阶段开始时,它的嵌套函数会被提升吗?
我正在调查这个问题,因为我真的不了解嵌套函数是如何记住的,它是在哪个词法环境/函数中定义的,如果它至少没有被提升,它有一个 [[Scopes]] 属性,它保留它的范围链
问题是我到目前为止看到的所有文章,甚至 ecmascript 6 文档也只说,如果扫描仪满足函数定义a,那么会发生提升,然后范围属性将使用范围链和变量对象创建,参数对象和“this”关键字,但我没有找到任何可以谈论的材料,如果嵌套函数(保存在变量对象中,并在那里加上对其在内存中的函数体的引用)至少也会被提升(同时,他们的父函数被提升)并且他们得到一个作用域链来记住他们的外部环境,如果他们从那里被外部环境调用
非常感谢阅读我的大量文字,如果你能回答它或者如果你有一篇关于这方面以及提升的文章,我真的很感激
javascript - 使用 JavaScript 的 with(){} 语句时,无效变量会去哪里?
当使用 JavaScript 的 with 语句时,具有无效名称的变量会去哪里?
你也可以引用 JavaScript 引擎中的代码吗?
javascript - 从事件函数更改全局变量
我正在尝试学习 Javascript。
我在 Youtube 上观看了一些 Javascript 课程,并正在尝试创建我的第一个项目。
项目应该是简单的井字游戏。
功能:第一次单击框应填“X” 第二次单击另一个框应填“Y” 第三次单击另一个框应再次填“X”以此类推,直到所有框都填满字符。
有我的代码 HTML
CSS
Javascript
还有项目链接 - https://jsfiddle.net/qwy2k571/
目前每个框都用“X”填充。我知道我并不完全理解闭包和作用域链,但请给我一个正确的代码以通过示例来理解它。
提前致谢并致以最诚挚的问候。
javascript - Javascript范围链继承
我是一名学习编程的学生。
我有个问题。
如果我想在 myObj 中使用 a 的方法,我们使用这段代码。
这意味着改变作用域链的目标。但是我们为什么不使用这段代码呢?
我认为创建和使用新对象一定是有原因的。但我不知道。请教我。谢谢你。