考虑以下JavaScript代码:

function getFunction(x) {
    var closureMember = x;

    return function() {
        return closureMember * 2;
    };
}

var f = getFunction(5);

在这里,对getFunction的调用将创建一个包含成员closureMember的闭包,返回引用此闭包的匿名函数,并将其分配给变量f。如果我调用匿名函数,它将执行其代码,并且实际上将访问闭包中的成员closureMember

JavaScript使我可以在匿名函数上调用toString方法,该函数返回其代码的文本表示形式。在这种情况下,表示形式将包含closureMember的名称,但不授予对实际变量的任何访问权限(请注意,如果多次调用getFunction,则它可以存在于多个实例中)。

题:
JavaScript是否提供任何反射功能,这些功能将允许在运行时分析/修改与函数实例关联的闭包的结构和内容?

最佳答案

我不确定这正是您想要的,但是下一个代码可以正常工作。

function getFunction(x) {
    var closureMember = x;

    return function() {
        return closureMember * 2;
    };
}

function changeClosure(x, closure){
    var closureMember = x;
    return eval("(" + closure.toString() + ")");
}

var f = getFunction(5);
var g = changeClosure(42, f);

g();

08-25 16:41