我理解了Node/Javascript的作用域规则,并且,例如,通过理解Javascript中的执行上下文和执行堆栈,我认为我理解了执行上下文如何工作的原理:问题是您能够实际访问它们吗?
对于2015年的问题How can I get the execution context of a javascript function inside V8 engine(涉及(ab)using (我很清楚这可能是XY问题,也可能是滥用Node/JavaScript的愿望:希望下面的背景部分能提供更多的上下文,如果有一种不同的方式来实现我想要的目标,那也能奏效。) 简单地说,我想实现像这样的事情: 在另一个模块中有一个函数可以随意改变其调用方作用域中的变量,这似乎是“危险的事情”的定义,所以如果有可能的话,我希望它应该更像: 而 问题变成了我可以用什么(如果有的话)替换 >
从函数返回一个新值。在我的实际用例中,我希望 具有 使用全局范围。如果我没有使用 请使用 12月初,SO网站上的一个随机问题提醒了我Code网站的出现,那里每天都有不同的编程问题出现,于是我决定尝试使用Node。我使用独立的JS文件解决了前两个问题,这时我意识到在每个文件之间复制粘贴了许多公共代码。在解决这些难题的同时,我决定创建一个“框架”程序来协调它们,并提供尽可能多的通用代码。创建框架的一个目标是单个“解决方案”文件应该尽可能“精简”:它们应该包含解决问题所需的绝对最少的代码。 与此问题相关的框架的一个特性是,它每次都会重新加载(当前使用 另一个相关特性是框架提供了 每个问题都有两组输入:一个“示例”输入(为其提供预期答案)和“实际”输入(往往更大,涉及更多)。框架通常会在启用跟踪的情况下运行示例输入(这样我就可以检查“内部工作”),在禁用跟踪的情况下运行“实际”输入(因为它会产生太多的输出)。对于大多数问题来说,这是很好的:为调用准备参数,然后调用 其中sharedVar = 1 ;
anotherModule.someFunction() ;
console.log( sharedVar ) ; // Where 'sharedVar' has changed value
sharedVar = 1 ;
anotherModule.hereIsMyExecutionContext( SOMETHING ) ;
anotherModule.someFunction() ;
console.log( sharedVar ) ; // Where 'sharedVar' has changed value
let otherExecutionContext ;
function hereIsMyExecutionContext( anExecutionContext ) {
otherExecutionContext = anExecutionContext ;
}
function someFunction() {
//do something else
otherExecutionContext.sharedVar = 42 ;
}
既不方便又分散注意力(虽然函数可能会更改这些变量中的一些值,但这不是函数的主要目的)。
function trace( ... ) {
if( traceMode ) {
print( ... )
}
}
TRACE && aoc.print( ... )
与此问题相关的框架的一个特性是,它每次都会重新加载选定的解决方案文件
这是关键。您不应该将加载,解析和执行留给 可以使用 我所提到的邪恶的事情最容易就是在代码前加一些“隐式导入”,不管是