javascript - 在函数中运行代码就像在另一个作用域中运行一样

标签 javascript node.js events

我正在遵循一些基于 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/

相关文章:

javascript - Vue.js 模型绑定(bind)到 jquery 输入

node.js - 无法使用 Grunt 和 shell (Codebox) 下载 ace 权限错误(虚拟机)

javascript - Mongoose 变量排序

mysql - 是否可以使用带乘法的 OFFSET 对查询进行分页?

javascript - jQuery Event.Target 供调用者引用

javascript - 在 SAPUI5 中更改复制的数据时原始模型正在更改

javascript - 按可以未定义的 'order' 字段对数组进行排序

javascript - Serverless express 关闭 mongodb 连接

javascript - 重新加载 iframe 时捕获 javascript 事件

wpf - Reactive Extensions (Rx) - 仅在按住某个键时订阅鼠标位置数据