在 JavaScript 中捕获调用方的范围
Capture caller's scope in JavaScript
此代码在 eval 运行的同一范围内工作:
function compile(fn) {
//Actually calls fn.toString() then compiles some es.next type
//features to current versions of es.
return 'function () { return a; }';
}
function runAsStringA() {
var a = 10;
var compiled = eval(compile());
return compiled();
}
这行不通,但符合我在理想世界中想要做的事情:
function compile(fn) {
return eval('function () { return a; }');
}
function runAsStringA() {
var a = 10;
var compiled = compile();
return compiled();
}
从本质上讲,我需要一种方法来评估父母的范围。
我试过了:
function compile(fn) {
return eval.bind(this, 'function () { return a; }');
}
function runAsStringA() {
var a = 10;
var compiled = compileSpecialFunction()();
return compiled();
}
问题是编译的函数在范围内没有a
。
我正在尝试在节点.js环境中使用它,因此如果解决方案仅在节点上工作,那很好.js
它甚至可能需要一些本机代码,尽管我没有编写本机附加组件的经验。
不幸的是,
这似乎是不可能的。
虽然我同意你应该避免eval
,并且可能veal
(正如我的拼写检查器所建议的那样),但这可能会有所帮助:
function compile(a) {
return eval('(function(a) { return a; })').call(this, a);;
}
function runAsStringA() {
var a = 10;
var compiled = compile(a);
return compiled;
}
console.log(runAsStringA());
相关文章:
- 日志:未捕获的范围错误:超过了最大调用堆栈大小
- 未捕获的范围错误:setTimeout()超过了最大调用堆栈大小
- JavaScript继承:未捕获的范围错误:超过了最大调用堆栈大小
- 收到“范围错误: 超出最大调用堆栈大小”错误
- 为什么我从 JSLint 获得从事件调用的函数的“超出范围”
- 在 JavaScript 中捕获调用方的范围
- 递归承诺调用 - 内存范围变量问题
- 是否可以对超出范围的 setInterval 变量调用 clearInterval 方法
- 如何更改对 javascript 属性的调用的范围/上下文
- 从全局范围调用 jQuery 中的函数
- 从脚本标记的全局范围调用webpack模块中的函数
- 为什么更改范围获胜'不能在ng if内部工作,而是通过函数调用AngularJS
- Angular.js的多个rest调用范围问题
- Chrome/jQuery未捕获范围错误:超过了最大调用堆栈大小(函数循环)
- 如何在 javascript 中更改方法调用的全局范围
- 从html调用angularjs控制器中的一个函数,但未定义范围变量
- AngularJS-范围错误:''之后超过了最大调用堆栈大小;应用程序启动
- Chrome 未捕获范围错误:最大调用堆栈大小超出了点击递归
- 事件调用和范围问题
- 如何从全球范围调用 jQuery 作用域内的函数