在 JavaScript 中捕获调用方的范围

Capture caller's scope in JavaScript

本文关键字:范围 调用 JavaScript      更新时间:2023-09-26

此代码在 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());