关闭不存储局部变量

时间:2016-12-10 16:24:35

标签: javascript closures

我正在尝试以同步顺序运行异步测试。 也就是说,每个测试都需要加载文件,因此根据定义不同步 - 相反,我想等待每个测试加载其文件,运行代码,然后才进入下一个测试并加载其文件等。 / p>

问题 - 非常奇怪的是,我得到的闭包不能正确地保留局部变量的值。

这个片段是一个更大的库的一部分,所以我不能给出一个你可以运行的自给自足的例子,但是这里的逻辑非常简单。

let viewer = ...;
let tests = [...]; // Let's say the length is 3

function runTestSync(callback, index) {
    console.log("FIRST", index)

    if (index >= tests.length) {
        callback(index, true);
    } else {
        let entry = tests[index];

        // Results in files being loaded
        entry[1](viewer);

        // Add an event listener to the "viewer" object, which will eventually call the callback when all files finished loading
        viewer.addEventListener("loadend", function listener() {
            if (viewer.resourcesLoading === 0) {
                console.log("SECOND", index);

                viewer.removeEventListener(listener);

                callback(index, false);
            }
        });
    }
}

function myIter(index, done) {
    if (!done) {
        runTestSync(myIter, index + 1);
    }
}

runTestSync(myIter, 0);

这是使用异步服务器提取的最简单的同步循环。 我想你们可以同意最终应该打印这些行:

FIRST 0
SECOND 0
FIRST 1
SECOND 1
FIRST 2
SECOND 2

反而会发生什么?

FIRST 0
SECOND 0
FIRST 1
SECOND 0
FIRST 1
SECOND 0
FIRST 1
...

我得到一个无限循环。 为什么对index的第二次访问总是等于0?这显然打破了闭包应该起作用的方式。

1 个答案:

答案 0 :(得分:0)

我忘了添加要在viewer.removeEventListener(TYPE, listener)删除的侦听器类型。 那些是10个小时,我赢了回来。