除了使用 'eval' 按名称访问变量以使用另一个变量 "sync" 之外,有什么替代方法?
What is an alternative to using 'eval' to accessing a variable by name to "sync" it with another?
我想在 运行 一个函数时保持两个 JavaScript 变量同步。要指向的变量在对象中。到目前为止我的代码是这样的:
var myname = "bob";
var thevar = "";
var varobj = {tvar: "myname"};
var syncvar = function() {
thevar = eval(varobj.tvar);
};
syncvar();
alert(thevar); // bob
myname = "eve";
syncvar();
alert(thevar); // eve
如何在不使用可怕的 eval 的情况下做类似的事情?请记住,我希望此功能具有通用性,即我希望它适用于任何人的对象。
提前致谢。
澄清编辑:这是客户端。我本质上想要一个 "pointer" 到另一个变量的变量(可能不是严格定义意义上的)。我做了一个可以同步变量的函数,但它使用 eval,这让我持怀疑态度。 "universal" 部分是我可以让 tvar 指向任何可以同步它的东西。例如,如果你包含上面的代码,那么你可以:
myage = 20;
varobj = {tvar: "myage"};
syncvar();
alert(thevar); // 20
myage = 100;
syncvar();
alert(thevar); // 100
因此使它 "universal" 成为 varobj.tvar 可以 "point" 任何东西以保持同步。
您可以使用 setter 和 getter 在名为 thevar
的 window 上创建 "virtual" 属性,镜像 varobj.tvar
:
Object.defineProperty(window, 'thevar', {
get: function( ) { return window[varobj.tvar] ; },
set: function(v) { window[varobj.tvar] = v; }
});
> varobj = { tvar: "bob" }
> thevar = 1
> bob
< 1
你是否真的想这样做完全是另一个问题。
我想在 运行 一个函数时保持两个 JavaScript 变量同步。要指向的变量在对象中。到目前为止我的代码是这样的:
var myname = "bob";
var thevar = "";
var varobj = {tvar: "myname"};
var syncvar = function() {
thevar = eval(varobj.tvar);
};
syncvar();
alert(thevar); // bob
myname = "eve";
syncvar();
alert(thevar); // eve
如何在不使用可怕的 eval 的情况下做类似的事情?请记住,我希望此功能具有通用性,即我希望它适用于任何人的对象。
提前致谢。
澄清编辑:这是客户端。我本质上想要一个 "pointer" 到另一个变量的变量(可能不是严格定义意义上的)。我做了一个可以同步变量的函数,但它使用 eval,这让我持怀疑态度。 "universal" 部分是我可以让 tvar 指向任何可以同步它的东西。例如,如果你包含上面的代码,那么你可以:
myage = 20;
varobj = {tvar: "myage"};
syncvar();
alert(thevar); // 20
myage = 100;
syncvar();
alert(thevar); // 100
因此使它 "universal" 成为 varobj.tvar 可以 "point" 任何东西以保持同步。
您可以使用 setter 和 getter 在名为 thevar
的 window 上创建 "virtual" 属性,镜像 varobj.tvar
:
Object.defineProperty(window, 'thevar', {
get: function( ) { return window[varobj.tvar] ; },
set: function(v) { window[varobj.tvar] = v; }
});
> varobj = { tvar: "bob" }
> thevar = 1
> bob
< 1
你是否真的想这样做完全是另一个问题。