我正在使用对象来命名我的JavaScript代码.这些对象通常包含使用的函数,这些函数将this-pointer 映射到对象本身apply.但是,我发现this每次我想访问对象的其他函数或属性时都使用-pointer 是不方便的,特别是因为在很多情况下我使用new-operator以使用类的方式使用函数对象.new Line()如果是,我宁愿写作new this.Line().
如果你能像php那样将函数局部变量添加到函数中会很棒extract(伪代码跟随,它有点复杂)
var sample_object = {
"some_function": function() {}
}
test() {
extract(sample_object);
some_function(); // imported from sample_object
}
Run Code Online (Sandbox Code Playgroud)
这甚至可能吗?
我很确定eval你是唯一的答案; 但是你需要知道,如果你的控制之外有任何输入,那就不安全了
function dynamicArgs (varName, varValue) {
eval("var " + varName + "=" + JSON.encode(varValue) );
alert(a);
}
dynamicArgs("a", "value");
Run Code Online (Sandbox Code Playgroud)
你可以看到这个问题.如果动态变量不知道它的名字,你的函数应该如何调用?我把它硬编码到一个变量,因为我在调用它时传递它,但这不是一个好的解决方案.唯一的解决方案是另一个eval.你真的应该考虑你需要做什么以及这是否有用.但这是可行的.
在这里它是行动:http://jsfiddle.net/mendesjuan/GG3Wu/
function dynamicArgs (varName, varValue) {
eval('var ' + varName + "='" + varValue + "';");
alert(eval(varName));
}
dynamicArgs("f", "Here I am");
Run Code Online (Sandbox Code Playgroud)
现在这里有一个像你正在做的例子,从http://jsfiddle.net/mendesjuan/AK3WD/创建一个变量this.MyConstructor
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 );
Run Code Online (Sandbox Code Playgroud)
如果您想将对象中的所有值导入范围,这是一个示例;
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");
Run Code Online (Sandbox Code Playgroud)
有争议with,它有一些很棒的应用程序,但速度有点慢并且容易出错。它会在严格模式下抛出错误(您应该始终选择进入)并且将被弃用。
var sampleObject = {
someFunction: function() {},
b: 10
}
with (sampleObject) {
typeof someFunction // "function"
var a = 42
var b = 20
}
sampleObject.a // undefined
sampleObject.b // 20
Run Code Online (Sandbox Code Playgroud)
请注意,在 -block 中定义的新变量with不会添加到对象中。然而,如果该对象中已经有同名属性,则该属性将被修改(谢谢,@Rocket)。
只是为了好玩,这里有一个using的实现extracteval(它比 更邪恶with)。你可以用它做一些难以形容的事情,例如,如果你的对象具有诸如sampleObject['x; while (true) { alert("Hi!") }'].
| 归档时间: |
|
| 查看次数: |
7009 次 |
| 最近记录: |