如何更新或覆盖范围内变量?

时间:2017-04-22 11:23:46

标签: javascript

假设我有2个这样的功能:

function test() {

    var item = {
        an_object:true
    };

    return function run_test() {
        console.log(item);
    };
}

function test2() {
    var script = test();
    var item = {
        different_object:true
    };

    script();
}

如果我运行test2()。我得到这个对象:

{an_object:true};

但我想:

{different_object:true};

是否可以更新脚本变量的内部变量而无需使用eval?

// I don't really want to use eval if i could help it. new Function() is also eval
eval('var func = '+script.toString());
func(); // output: {different_object:true}

1 个答案:

答案 0 :(得分:1)

没有。 script变量指的是关闭item的函数,但您无法使用script访问item并调整其属性,因为它永远不会暴露item(除了控制台)。

你只能evalnew Function只能在script工作,因为你必须替换功能,这意味着它不再关闭item

正如您所提到的,使用eval可以替换全新的item变量并通过eval创建新功能:



function test() {

    var item = {
        an_object:true
    };

    return function run_test() {
        console.log(item);
    };
}

function test2() {
    var script = test();
    console.log("Original:");
    script();
    var item = {
        different_object:true
    };
    script = eval("(" + script + ")");

    console.log("Updated:");
    script();
}

test2();




或通过new Function传递item



function test() {

    var item = {
        an_object:true
    };

    return function run_test() {
        console.log(item);
    };
}

function test2() {
    var script = test();
    console.log("Original:");
    script();

    script = new Function("item",
      "return " + script
    )({
        different_object:true
    });

    console.log("Updated:");
    script();
}

test2();




...但是这些都需要往返源代码,如果函数script引用了任何其他信息,它会关闭并需要它,它会停止工作(在这种情况下它不会。)