假设我有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}
答案 0 :(得分:1)
没有。 script
变量指的是关闭item
的函数,但您无法使用script
访问item
并调整其属性,因为它永远不会暴露item
(除了控制台)。
你只能eval
或new 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
引用了任何其他信息,它会关闭并需要它,它会停止工作(在这种情况下它不会。)