问题标签 [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 - 验证我对范围链的理解
(问题 1)
在 Flanagan 的 JS Definitive Guide 中,他定义了Function
方法bind()
以防万一它不可用(在 ECMAScript 3 中不可用)。
它看起来像这样:
他用一个例子来说明它的用法(我已经修改了它以将第 3 行从 更改f.bind(o)
):
当我第一次看到这个时,我想“不会arguments
在我们定义的绑定函数中引用 arguments 变量吗?但是我们想要最终应用它的函数的 arguments 属性,就像上面示例中的 g ...... "
我验证了他的示例确实有效,并推测该行return f.apply(o, arguments)
直到var g = bind(f, o)
上面才被评估。也就是说,我想,当你返回一个函数时,你只是返回那个函数的源代码,不是吗?直到它被评估?所以我通过尝试一个稍微不同版本的绑定来测试这个理论:
如果它只是简单地返回未评估的函数源,那么arguments = 6
在以后评估时它就无法存储,对吧?在检查之后,我仍然得到g(2)
=> 3。但后来我意识到——如果它只是返回未评估的代码,那么o
in是return f.apply(o, arguments)
如何通过的?
所以我决定必须发生的事情是这样的:
和变量(即使等于 6)被传递给函数o
。只是当函数最终被调用时,变量被解释器重新定义为(in ) 的参数,因此我试图传递的参数的原始值被替换了。但这意味着在此之前它只是将函数存储为文本,因为否则将只是程序中的数据,而不是可以被覆盖的变量。这个解释正确吗?arguments
arguments
g
arguments
g
g(2)
o
arguments
(问题 2)在同一页的前面,他定义了以下函数,该函数使用该apply
方法跟踪函数以进行调试:
这里不是this
指我们定义的函数,而不是对象o
吗?或者这两件事是一回事吗?
javascript - 双重嵌套函数值返回停止进入双重嵌套函数
试图从David Shariff 的博客中理解范围链和执行上下文堆栈文章,我试图在这里理解闭包
我只是想测试内部函数是否仅具有来自其父级或整个作用域链的变量对象,因此我添加了一个重复该示例的嵌套函数:
这并没有给出任何结果。似乎解释器甚至没有进入foobar()函数。并且语法与其父级相同。
但如果我将函数声明和执行分开,它就会起作用。
真的,我试图猜测为什么;bar()和foobar()函数的区别在哪里。
PS - 我在JSFiddle上测试
javascript - javascript 闭包规则和作用域链
闭包规则是:函数使用定义时有效的作用域链执行。
在下面的 setTimeout 回调函数中,定义时 x 尚未在范围内。因此,程序应该打印 undefined,但打印的是 7,为什么?我错过了什么?
还是因为上面的代码和下面的完全一样?
javascript - 我的函数不知何故无法访问其父闭包并且缺少变量。如何?
在我的顶级函数中,我使用 require.js 导入了一些依赖项。他们在那里,没问题。在这个函数中,我定义了一个回调函数,并尝试使用一些通过 require.js 导入的变量,即父闭包中的变量。
他们只是不存在,正如断点和浏览 Chrome 检查器的范围变量面板所证实的那样。
我知道fn.apply
朋友们只是尽可能this
地设置上下文,而不是他们可以破坏对闭包的引用或改变范围链。
这怎么可能?
我该如何解决?
javascript - JavaScript 闭包与本地
我有一个 Javascript 主文件,它被一个立即调用的闭包包围(以免污染“全局”:
从函数头中删除变量时,我犯了一个简单的、令人头疼的编码错误,以至于我的代码使用逗号而不是分号:
当然,“var i”行上缺少的分号是问题所在。但是我认为应该发生的行为是我现在本地定义的变量 'closureVariable' 应该已经隐藏了更高级别的范围定义,并且我的本地定义变量的值应该可以用于范围链中较低的函数(也就是说,函数'confused'应该打印出'[1,2,3,4]';
我在这里对 Javascript 范围链有什么不了解的地方?
javascript - javascript 闭包和作用域链示例
有人可以(清楚而简洁地)向我解释为什么这段代码会这样工作吗?我来自 Java(6 和 7)中的强类型背景,其中不存在闭包,也不像在 javascript 中那样运行。我认为与这个问题相关的概念是:闭包和范围链。
这是示例:
上面的例子记录了 9(10 次),但期望和我自己的直觉认为它会记录 0-9。
为什么这会像在 Javascript 中那样工作?闭包非常强大,但我试图一劳永逸地掌握这个概念!稍加修改的示例会产生正确的输出,但为什么呢?
闭包不是 Javascript 独有的,但我想看看为什么它们在实际编写 javascript 以与浏览器/dom 交互的上下文中如此强大。
有没有人有很好的、实用的例子来说明我们在与浏览器/dom 交互时如何应用闭包技术?
谢谢。
javascript - Javascript 中未添加动态添加的对象属性
请耐心等待,我对 Javascript 很陌生。我正在拔头发,试图弄清楚为什么这不起作用。请记住,我来自 Java 背景。我有一个函数“getCsvData”,我实际上是在尝试解析 CSV 文件并将对象属性动态添加到数据源对象,然后返回它。如您所见,在函数“getCsvData”之外,我尝试在调用函数后记录结果,但结果对象是空的,并且没有添加任何对象属性。
我有一种非常强烈的感觉,这是由于我仍在努力学习和理解的闭包/范围链解决方案。
问题是:为什么不将属性动态添加到数据源对象中?我相信它们实际上是添加在作为“$.get”的第二个参数传递的匿名函数“function(data)”的范围内,但是一旦外部函数“getCsvData”返回,它们就会立即消失。为什么,我该如何解决这个问题?谢谢!!
javascript - Why do new invocations of this function create new scope chains and a new private variables?
If we have this basic function (and its closures):
Is this what's happening in memory? (basically a pointer to a function object and its scope chain)
(source: geraldleroy.com)
Is the above diagram correct? If so, I'm not understanding why these two lines of code create two new scope chains and new private variables:
var c = counter();
var d = counter();
It seems like both c and d would refer to the original function object and would use its scope chain.
I'm a little confused and would appreciate any insight on this that anyone can offer.
Thanks!
javascript - javascript 在作用域链中操作值
我一直在阅读 Javascript 闭包和作用域链,但我还没有看到任何关于从作用域链中操作变量的内容。这是我遇到的类似情况:
我怎样才能让它返回{firstFunction: 'yes', secondFunction: 'yes', thirdFunction: 'yes'}
代码可能有语法错误,但这是我试图理解的想法。我只是即时编写了这段代码,所以你们可以看到与我要修复的内容类似的场景。
谢谢
javascript - 范围链查找与原型查找 - 这是什么时候
如果一个变量在需要时在函数中不可用,则在作用域链中查找它(这是一个闭包),但其他时候在原型链中搜索它。我正试图将我的头包裹起来,这是什么时候发生的。我想知道是否有人可以为我清除迷雾,或者让我参考一些专门讨论这个话题的文献。
例如,我是否正确地说: - 对象以及与上下文 (this) 相关的公共变量总是在原型链中查找?- 私有变量总是在作用域链中查找(即执行上下文中的函数链)?- 是否有任何情况下程序同时查看两者/其中一个?
我测试了三种不同的场景(范围链查找、原型查找和不查找),但不幸的是,它对深入了解这一点没有足够的帮助。
谢谢!