在函数中运行代码,就好像它在另一个作用域中运行一样
Run code in function as if it were running in another scope
下面是一些基于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()
所依赖的东西都不处于正确的状态。
解决这个问题的通常方法是创建独立的函数,而不依赖于其他全局状态或其他范围中的状态。如果它们创建/初始化自己的状态,或者被传递了它们应该使用的状态(或两者的某种组合),那么它们可以从任何地方调用。
相关文章:
- 监视函数从服务返回不起作用,但作用域函数起作用
- 将作用域存储在JSON中
- 从控制器继承了隔离的作用域以生成可重用的指令
- 从ng模板访问作用域
- 调用私有作用域
- 对父作用域的指令更新延迟了一步
- 正在$rootScope上达到控制器作用域$在内部控制器上
- 两个指令创建新的继承的和隔离的作用域-元素得到哪个
- 这两个关于 JavaScript 作用域链的例子有什么区别?
- 在具有命名作用域的自定义Polymer元素中隐藏表行
- AngularJS指令隔离作用域
- Angularjs:修改js中的作用域,稍后在页面中使用
- Javascript 匿名函数表达式在运行时的作用域
- 在函数中运行代码,就好像它在另一个作用域中运行一样
- NodeJS在相同的作用域/上下文中运行所有的include
- AngularJS指令——在作用域参数改变时重新运行link函数
- 如何在父作用域获得restful数据后在子作用域运行函数
- AngularJS在作用域改变后如何运行javascript
- 试图在作用域隔离的指令中运行绑定方法
- 如何从必须在目标页面作用域中运行的代码中调用Greasemonkey's GM_函数