我有一个for-loop
,它包含一些在循环中声明的局部变量n
。因此,我希望n
的值一旦程序退出循环就会被销毁。
但是,n
的值似乎在for循环之外仍然可用。为什么会这样?另外,我应该在什么时候希望n的值(如果未注释,也是值k)
被销毁?
const delayHelper = require('./delayExecutor')
async function main() {
let promises = [];
let records = [1, 2, 3, 4];
for(let i = 0; i < records.length; i++) {
let n = 1000 + records[i];
// let k = 123;
promises.push(delayHelper.delayResolve(() => records[i], 1000).then(data => data + n))
}
console.log(await Promise.all(promises)); //print: [ 1002, 1004, 1006, 1008 ]
}
main()
//delayExecutor.js
let delayedResolve = (fun, ms) => {
return new Promise((y, n) => {
setTimeout(() => {
y(fun());
}, ms);
});
};
exports.delayResolve = delayedResolve;
这里有几个概念需要注意。1.关闭范围。块范围
当您访问内部函数定义中的n
时,该变量在该内部函数的闭包范围内保持活动,直到不再需要它为止,
使用let
声明n
将在块作用域中创建一个新变量(此处为for
循环),该变量将在相应的迭代中被锁定到内部函数。
您还可以尝试使用var
声明n
,这将产生不同的结果-[1005,1006,1007,1008]
。这是因为var
不是块作用域声明,因此它不会为循环的每次迭代创建新变量。循环结束时n
的最终值为1004
,该值将用于逻辑data=>data+n
对于你问题的第二部分--据我所知,所有的变量引用都将在函数的末尾被清除。由于n被锁定在内部函数data=>data=n
的闭包范围内,n
值一旦执行就会被清除。
问题内容: 我有一个关于变量范围的相当简单的问题。 我对增强型循环很熟悉,但是我不明白为什么我应该声明一个新变量来保留每个元素。一个例子可以澄清我的问题: 那为什么要声明这个新变量呢?毕竟在for循环内是可访问的。我不想使用任何先前的值,只是不想声明一个新变量。(我猜想对于其他可迭代项,使用相同变量可能会更快)。 我想这就是增强型循环的构建方式,但这不会破坏整个范围的想法吗? 上述行为引起了一个问
问题内容: 根据Java语言规范§14.14.2,增强循环的变量必须在循环本地。换句话说,它将编译为: 但这不是: JLS没有为这种语言设计选择提供任何依据。我可以看到如果通过或通过注释修改了局部变量的原因,为什么必须出现类型名称,但是我不明白为什么不允许在其他地方声明的变量的裸名。是否有人对为什么施加此限制有任何见解? 编辑 到目前为止,有几个答案似乎表明,循环之外发生的事情是按这种方式设计语言
问题内容: 我有以下代码可以SSH到节点并从其他设备中找到RSSI。 bot_ipv6是ssh到的ipv6地址的列表,脚本使用pexpect来ssh。 数据现在包含该设备的输出。 我想浏览数据并仅获取地址及其对应的RSSI。当命令可以在本地运行并输出到文件时,此代码有效: 匹配和匹配行是在其中定义的函数,在其他地方则在文件中查找以将字符与所要查找的字符进行匹配。 我的问题是我不知道如何将数据输出到
问题内容: 我有用nodejs编写的代码让我感到困惑 我希望循环内第二个函数中的数据可以推入结果 所以我以前的数据是这样的 像这样 我尝试了几种方法,首先输入命令deferred.resolve();。循环中仅显示1个数据的语句有什么解决方案? 问题答案: 而不是在将立即解决的数组上使用,而是使用它等待一个promise数组: 甚至更好:
问题内容: 我正在尝试解决一个任务(我对Java还是很陌生),并且已经花了很多资源来解决此冲突,但是仍然无法解决(注意:Tuna是我的Scanner变量) } 结果是:线程“ main” java.lang.Error中的异常:未解决的编译问题:重复的局部变量计数 我应该解决的问题是: 编写程序以读取一个数字并将所有数字从1汇总到该数字。例如,如果用户键入6,则输出为21(1 + 2 + 3 +
下面是我的代码 错误:我在封闭范围中定义的局部变量必须是最终的或实际上是最终的