首页
学习
活动
专区
圈层
工具
发布

摆脱eval
EN

Stack Overflow用户
提问于 2012-04-28 01:30:15
回答 3查看 526关注 0票数 0

我在javascript变量中有一个字符串形式的方法名,我想得到它调用变量的结果:

代码语言:javascript
复制
var myMethod = "methodToBeCalled";
var result;
eval("result = "+myMethod+"();")

这是可行的,没有任何问题。但这段代码对Google Closure Compiler来说是不可接受的。如何修改它才能与之配合使用?谢谢!

编辑:

例如,当方法的名称在某个对象中时,建议的解决方案似乎不起作用:

代码语言:javascript
复制
var myFunction = function () { return "foo!" }
var myObject = {
    itsMethod: function() { return "foo!" }
};
...
var fstMethodToCall = "myFunction"
var sndMethodToCall = "myObject.itsMethod";
...
window[fstMethodToCall](); // foo!
window[sndMethodToCall](); // undefined
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-28 01:31:16

假设您不在某种嵌套作用域中,请尝试:

代码语言:javascript
复制
var result = window['methodToBeCalled']();

代码语言:javascript
复制
var myMethod = 'methodToBeCalled';
var result = window[myMethod]();

要执行基于字符串规范的任意深度的任意函数,而不执行eval:

代码语言:javascript
复制
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();
票数 2
EN

Stack Overflow用户

发布于 2012-04-28 01:31:32

您可以使用索引器表示法:

代码语言:javascript
复制
result = window[myMethod]();
票数 2
EN

Stack Overflow用户

发布于 2012-04-28 23:34:28

闭包编译器没有禁止' eval ',如果你觉得方便的话,你可以继续使用它,但你必须明白编译器不会试图理解eval语句中发生的事情,并假设你的eval是“安全的”:

代码语言:javascript
复制
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来引用全局变量和对象属性,因为这些变量和对象属性不会被重命名或删除(但不会删除局部变量)。

对于高级优化,这有点棘手,因为编译器会尝试删除和重命名全局变量和局部变量。因此,您需要导出需要保留的值。如果您使用字符串尝试通过其他方式引用名称,也是如此:

代码语言:javascript
复制
var methodName = "myMethod";
(window[methodName])()

代码语言:javascript
复制
var methodName = "myMethod";
eval(methodName+"()")

编译器不会尝试确定"methodName“是否是对函数的引用。下面是一个高级模式导出的简单示例:

代码语言:javascript
复制
window['myMethod'] = myMethod;

赋值完成两件事:如果myMethod函数被删除,它将保留该函数;通过使用字符串将其赋值给属性,为其指定一个固定的名称。如果您确实需要引用局部值,则需要稍微使用一些技巧,并使用函数构造函数。我的第一个例子中的"f“的定义,它可以计算本地变量:

代码语言:javascript
复制
var f = new Function("x", "y", "alert(eval('y')); alert(eval('\"' + x + '\"'));");

你可能会发现这个页面很有用:

https://developers.google.com/closure/compiler/docs/limitations

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10355230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档