Tôi chắc chắn eval
là câu trả lời duy nhất của bạn; nhưng bạn cần phải lưu ý rằng nếu có bất kỳ đầu vào ngoài tầm kiểm soát của bạn có liên quan, nó không phải là an toàn
function dynamicArgs (varName, varValue) {
eval("var " + varName + "=" + JSON.encode(varValue));
alert(a);
}
dynamicArgs("a", "value");
Bạn có thể thấy vấn đề với điều này. Hàm của bạn được gọi là biến động như thế nào nếu nó không biết tên của nó? Tôi hardcoded nó vào một biến kể từ khi tôi vượt qua nó trong khi gọi nó, nhưng đó không phải là một giải pháp tốt. Giải pháp duy nhất sẽ là eval
khác. Bạn thực sự nên suy nghĩ về những gì bạn cần làm và cho dù điều này là hữu ích. Nhưng nó có thể thực hiện được.
Đây là nó trong hành động: http://jsfiddle.net/mendesjuan/GG3Wu/
function dynamicArgs (varName, varValue) {
eval('var ' + varName + "='" + varValue + "';");
alert(eval(varName));
}
dynamicArgs("f", "Here I am");
Bây giờ đây là một ví dụ như những gì bạn đang làm, tạo ra một biến từ 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);
Và đây là một ví dụ nếu bạn muốn để nhập tất cả các giá trị từ một đối tượng vào phạm vi;
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");
Nguồn
2012-01-19 21:03:37
Bạn *có thể* sử dụng một khối 'with', nhưng, tôi không đề nghị nó. Tôi cũng nghĩ rằng nó bị loại bỏ trong chế độ nghiêm ngặt ES5. –
@Rocket Tôi uparrow không đề xuất nó một phần nếu tôi có thể :-) Đó là sự thật nó muốn làm việc, nhưng 'with' là khó hiểu và kỳ lạ. Ngoài ra tôi khá chắc chắn nó gây ra vấn đề hiệu suất nhưng tôi không thể nhớ lời giải thích cho điều đó. – Pointy
Nếu bạn vượt qua một mảng làm đối số thì sao? – elvenbyte