我很肯定eval
是你唯一的答案;但你要知道,如果有涉及您的控制範圍之外的任何輸入時,它是不是安全
function dynamicArgs (varName, varValue) {
eval("var " + varName + "=" + JSON.encode(varValue));
alert(a);
}
dynamicArgs("a", "value");
你可以看到問題與此有關。如果你的函數不知道它的名字,它應該如何調用動態變量?我將它硬編碼爲一個變量,因爲我在調用它時將其傳入,但這不是一個好的解決方案。唯一的解決辦法是另一個eval
。你真的應該考慮你需要做什麼以及這是否有用。但它是可行的。
這是在行動:http://jsfiddle.net/mendesjuan/GG3Wu/
function dynamicArgs (varName, varValue) {
eval('var ' + varName + "='" + varValue + "';");
alert(eval(varName));
}
dynamicArgs("f", "Here I am");
現在這裏就像你正在做的事情爲例,從this.MyConstructor
http://jsfiddle.net/mendesjuan/AK3WD/
var ns = {
MyConstructor: function(val) {
this.prop = val;
},
runConstructor: function(val) {
var Ctor = "MyConstructor";
eval('var ' + Ctor + ' = this.' + Ctor);
return new MyConstructor(val);
}
}
alert(ns.runConstructor("Hello").prop);
創建一個變量,在這裏,如果你想有一個例子將對象中的所有值導入範圍;
http://jsfiddle.net/mendesjuan/AK3WD/1/
var ns = {
MyConstructor: function(val) {
this.val= val;
},
anotherProperty: 5,
runConstructor: function(val) {
// Bring all the variables from this into this scope
for (var prop in this) {
eval('var ' + prop + ' = this.' + prop);
}
alert('Testing var anotherProperty: ' + anotherProperty);
var obj = new MyConstructor(val);
alert('Created MyConstructor: its prop is ' + obj.val)
}
}
ns.runConstructor("Hello");
你*可以*使用'with'塊,但是,我不建議這樣做。我也認爲它在ES5嚴格模式下被刪除。 –
@火箭如果我可以這樣做的話,我會高興的不建議它的一部分:-)這是事實,它會起作用,但「與」是混亂和怪異的。此外,我很確定它會導致性能問題,但我不記得對此的解釋。 – Pointy
如果你傳遞一個數組作爲參數會怎麼樣? – elvenbyte