我在javascript变量中有一个字符串形式的方法名,我想得到它调用变量的结果:
var myMethod = "methodToBeCalled";
var result;
eval("result = "+myMethod+"();")这是可行的,没有任何问题。但这段代码对Google Closure Compiler来说是不可接受的。如何修改它才能与之配合使用?谢谢!
编辑:
例如,当方法的名称在某个对象中时,建议的解决方案似乎不起作用:
var myFunction = function () { return "foo!" }
var myObject = {
itsMethod: function() { return "foo!" }
};
...
var fstMethodToCall = "myFunction"
var sndMethodToCall = "myObject.itsMethod";
...
window[fstMethodToCall](); // foo!
window[sndMethodToCall](); // undefined发布于 2012-04-28 01:31:16
假设您不在某种嵌套作用域中,请尝试:
var result = window['methodToBeCalled']();或
var myMethod = 'methodToBeCalled';
var result = window[myMethod]();要执行基于字符串规范的任意深度的任意函数,而不执行eval:
var SomeObject = {
level1: {
level2: {
someFunc: function () {
console.log('hello');
}
}
}
};
var target = 'SomeObject.level1.level2.someFunc';
var obj;
var split = target.split('.');
for (var i = 0; i < split.length; i++) {
obj = (obj || window)[split[i]];
}
obj();发布于 2012-04-28 01:31:32
您可以使用索引器表示法:
result = window[myMethod]();发布于 2012-04-28 23:34:28
闭包编译器没有禁止' eval ',如果你觉得方便的话,你可以继续使用它,但你必须明白编译器不会试图理解eval语句中发生的事情,并假设你的eval是“安全的”:
function f(x, y) {
alert(eval("y")); // fails: hidden reference to "y"
alert(eval('"'+x+'"')); // might be valid
}
f('me', 'you');当编译器优化这个函数时,它会尝试删除"y“并重命名剩余的参数。这将是第一个由于"y“不再存在而失败的eval。第二次评估将正确显示警报"me“。
因此,通过简单的优化,您可以使用eval来引用全局变量和对象属性,因为这些变量和对象属性不会被重命名或删除(但不会删除局部变量)。
对于高级优化,这有点棘手,因为编译器会尝试删除和重命名全局变量和局部变量。因此,您需要导出需要保留的值。如果您使用字符串尝试通过其他方式引用名称,也是如此:
var methodName = "myMethod";
(window[methodName])()或
var methodName = "myMethod";
eval(methodName+"()")编译器不会尝试确定"methodName“是否是对函数的引用。下面是一个高级模式导出的简单示例:
window['myMethod'] = myMethod;赋值完成两件事:如果myMethod函数被删除,它将保留该函数;通过使用字符串将其赋值给属性,为其指定一个固定的名称。如果您确实需要引用局部值,则需要稍微使用一些技巧,并使用函数构造函数。我的第一个例子中的"f“的定义,它可以计算本地变量:
var f = new Function("x", "y", "alert(eval('y')); alert(eval('\"' + x + '\"'));");你可能会发现这个页面很有用:
https://developers.google.com/closure/compiler/docs/limitations
https://stackoverflow.com/questions/10355230
复制相似问题