在函数中运行代码,就好像它在另一个作用域中运行一样

Run code in function as if it were running in another scope

本文关键字:运行 作用域 一样 另一个 代码 函数      更新时间:2023-09-26

下面是一些基于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()所依赖的东西都不处于正确的状态。

解决这个问题的通常方法是创建独立的函数,而不依赖于其他全局状态或其他范围中的状态。如果它们创建/初始化自己的状态,或者被传递了它们应该使用的状态(或两者的某种组合),那么它们可以从任何地方调用。