为了循环内的const用法,为什么这个行为?

我在我的nodejs代码中有一个for循环

const saveDocument = co.wrap(function *(documentData, user, locale) { var now = moment(); var creationDateLongString = now.format("YYYYMMDDHHmmss"); var creationDateShortString = now.format("YYYYMMDD"); var outputChildFolder = documentData.code + '_' + creationDateLongString + '_' + documentCounter; var outputFolder = config.files.incomingDocumentsDir + '/' + outputChildFolder; ++documentCounter; yield fs.mkdir(outputFolder) var xmlFileName = documentData.code + "-" + creationDateLongString + ".xml"; var pdfFileName = documentData.code + "-" + creationDateLongString + ".pdf"; const pages = []; for(var index=0;index < documentData.pages.length; ++index) { const page = documentData.pages[index]; var data = new Buffer(page, "base64"); var dataEncoding = imageType(data).mime === "image/png" ? "png" : "jpg"; var fileName = "page" + index + "." + dataEncoding; var targetFilePath = outputFolder + "/" + fileName yield fs.writeFile(targetFilePath,data); pages.push(fileName); } ... } 

我不明白的是为什么在上面的代码page只有第一次迭代才被分配一次,并在其他迭代中保持相同的值。 所以,如果我有5页,我最终结束5次与该variables的第一页的数据。

我正在运行节点4没有任何特殊的参数或后处理器。 简单的npm run ...映射到我的package.jsonnode src/main/myApp.js

我可能错过了一些简单的东西,但是在做客户端ES6代码之前我从来没有见过这样的东西。 当然,客户端代码通过Babel + Webpack和服务器端代码直接通过节点运行的最大区别。

小附录:如果你想知道为什么“老学校”的语法,而不是沿着pages.forEach(.... ,这是因为这是现有的代码,我只是做了一些小的修改行的东西。

这将工作,因为你在严格的模式期待。 尝试添加…

 "use strict"; 

您只会在实际遵守和执行关键字的环境(如Node)中看到此行为。 Babel现在简单地将所有的letconst转换为var来提供ES5兼容性。 为了演示,请看这个巴别塔的例子 。 你可以在输出中看到const已经变成了var