【发布时间】:2016-08-25 07:10:20
【问题描述】:
我一直在尝试围绕范围,特别是闭包。 我知道有很多关于这个主题的帖子,而且我已经阅读了很多。但是大多数地方都将主题称为高级,并且使用相对难以掌握的术语。我想绝对确定我的基础知识是正确的,这样我就不会冒险进入更复杂的主题,而对函数的真正工作方式有错误的想法。
所以...我选择了一个基本功能,并且真的希望有人告诉我我认为它发生的幕后是否是实际发生的。
这是代码:
function sum(a) {
return function(b) {
return a+b
}
}
console.log( sum(1)(sum(2)))
(我知道它实际上并没有做总和,我对其进行了调整,试图了解每个步骤中发生了什么。)
所以,我的主要疑问是为什么 A 是 1,而不是 2。我得出的结论是,只要创建了 function(b) 以将 sum(2) 作为参数,就在被返回后立即创建了闭包sum(1)。因此,根据闭包的定义,我假设在创建函数时它还保存了词法环境(其中a = 1)。是这样吗?
我已经制作了一个步骤图。
【问题讨论】:
-
我了解代码,但不了解您的图表,因此不清楚您所说的大写
As 是什么意思,我不知道如何回答。请注意,sum(2)返回一个您从未调用过的新函数,因此它的闭包在这里无关紧要。另外,鉴于sum(2)返回一个新函数,为什么要将它作为参数传递给sum(1)的返回值?将数字 1 添加到函数引用是没有意义的。 JS 会做(产生一个字符串),但这似乎是一个相当奇怪的测试用例。 -
@nnnnnn 应该是
a = 1,每个矩形代表一个词法环境。好的,我认为您刚才所说的关于sum(2)的返回从未被调用,有助于理解它。只是为了澄清一下,这里仍然发生了两个闭包,对吗?一个是第一次定义sum(1),另一个是sum(2) -
@Sean 您收到了多个回复,但没有接受任何回复。究竟是什么导致了您的问题?
标签: javascript nested closures lexical-scope lexical-closures