javascript - 代码运行后字符串发生变化

标签 javascript node.js

<分区>

我知道在 javascript 中对象是通过引用复制的,但这很奇怪。

var project = projects[projectIndex];

var projectName = project[0]["repository"]["name"];
console.log("type" + " of name " + projectName + " in " + ownerFolderName);

projectTasks.push(function(callback){
    omnifocus.create_folder_if_possible_in_group(projectName, ownerFolderName, function () {
      callback();
    });
});

在这个片段中循环运行多次。使用 console.log 记录时,projectName 是正确的。但是,当在匿名函数中使用时(在 projectTasks 中),该值始终与最后一项的值相同。

例如:如果循环三次,它将记录“1”、“2”、“3”(这是正确的)。但是,在匿名函数中,它会以“3”值运行 3 次。

完整代码可在此处获得:https://github.com/gcamp/github-omnifocus-sync/blob/master/index.js

最佳答案

这是标准的闭包问题。

您有一个名为 projectName 的变量。您在访问此变量的循环中定义函数。但是这些函数在定义时并没有使用变量的值——它们将在调用时使用变量的值。因为您正在遍历项目并在此过程中更改 projectName,所以在调用函数时,该值是循环中的最后一个值。

解决这个问题的标准方法是使用 IIFE 在每个循环的基础上限制变量:

for (var projectIndex in projects) {
    var project = projects[projectIndex];

    var projectName = project[0]["repository"]["name"];
    console.log("type" + " of name " + projectName + " in " + ownerFolderName);

    (function(projectName) {
        projectTasks.push(function (callback) {
            omnifocus.create_folder_if_possible_in_group(projectName, ownerFolderName, function () {
                callback();
            });
        });
    })(projectName);
}

关于javascript - 代码运行后字符串发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25656771/

相关文章:

javascript - Jquery 无法访问循环外的数组

javascript - JQuery .attr() 不适用于指定的 ID

node.js - 无法让 ejs 页面呈现

node.js - 测试 Grunt 任务

javascript - 如何从nodejs中的另一个文件回调函数?

javascript - 使用 doc.output() 的问题 - jsPDF

javascript - JavaScript 中的回调函数如何工作

node.js - pm2下如何运行nuxt?

javascript - 恢复 + typescript :

javascript - 具有不同触发选项的单个 html 元素上的多个 tippy.js 实例