我正在遵循一些基于 Node.js 的音乐播放器的示例代码。该示例只是让播放器播放命令行上传递的一些文件:
for (var i = 2; i < process.argv.length; i += 1) {
batch.push(openFileFn(process.argv[i]));
}
我想更改它,以便仅在另一个事件发生时运行播放某些内容的代码。我尝试通过将上面的代码包装在一个函数中并从我的事件处理程序调用它来做到这一点。不幸的是,当我这样做时什么也没有发生:
function play() {
for (var i = 2; i < process.argv.length; i += 1) {
batch.push(openFileFn(process.argv[i]));
}
}
play(); // Works
function eventHandeler() {
// Other code
play(); // Doesn't work!
}
我已经验证了 play 函数是通过在调试器中设置断点来调用的,所以我能想到的唯一一件事是该函数在某种程度上因范围的更改而变得困惑。如何在所需范围内调用 play()
?
这是包含所有代码的 GitHub 要点:https://gist.github.com/anonymous/01f9572e73cdf3103e7b
最佳答案
从较低范围调用像 play()
这样的函数没有问题。在这两种情况下该函数都是可达的。因此,这不仅仅是范围问题。
因此,问题更可能是函数所依赖的其他变量的时间和状态之一。例如,变量 batch
必须处于适当的状态,以便您的函数 play()
执行其预期的操作。我的猜测是,当您进行第二个函数调用时,该变量或 openFileFn()
所依赖的内容未处于正确的状态。
解决此问题的通常方法是创建独立的函数,不依赖于其他全局状态或其他作用域中的状态。如果它们创建/初始化自己的状态或传递它们应该使用的状态(或两者的某种组合),那么可以从任何地方调用它们。
关于javascript - 在函数中运行代码就像在另一个作用域中运行一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26113796/