替换私有范围变量中的eval

时间:2012-04-03 02:35:55

标签: javascript jquery eval scope

我正在尝试删除此函数中的eval语句。我已经习惯了这种[无论]样式的替换,但在这种情况下它不起作用。 看看:

var App = (function(fw) {
    var somevar1 = "hello";
    var somevar2 = "world";
    this.get = function(what) {
        return eval(what);
    }
});

var app = new App({some: "thing"});

// now for the use:
console.log(app.get("somevar1"),app);​

在该功能中,我所有正常的“eval scrubbing”选项都不起作用,我无法使用:

 return this[what]
 return [what]
 return app[what]
 return new Function(what);

当然,这不是一个需要评估的奇怪案例吗? .. ps我必须注意,我无法重新审视App中的变量,因为它是巨大代码库的一部分。

这是摆弄的东西:

http://jsfiddle.net/xAVYa/

3 个答案:

答案 0 :(得分:6)

不幸的是,你运气不好; eval唯一可以访问等变量的东西。下次,不要那样做:)

您可以通过保留data对象来启动迁移:

var App = (function(fw) {
    var data = {
        somevar1: "hello",
        somevar2: "world"
    };

    this.get = function(what) {
        return data[what];
    };
});

然后逐步在您看到的整个代码库中执行此操作。它不应该破坏任何东西。

答案 1 :(得分:3)

如果没有eval,则无法通过字符串名称访问任意局部变量。因此,除非您愿意更改app函数内其他代码访问这些变量的方式,否则您将不得不坚持使用eval(看起来很难看)。

另一方面,如果您愿意更改访问app()somevar1的{​​{1}}函数内的代码,那么您可以选择。请注意,您不必更改somevar2函数之外的任何内容,因为您可以保留app()函数的相同合同,因此这不是任何地方难以找到所有可能位置的人之一可能正在访问这些变量的项目。由于它们当前的声明方式,它们只能直接从.get()函数内部访问,因此您的搜索/替换将仅限于该范围。

如果变量可以作为对象的属性,则可以这样做:

app()

答案 2 :(得分:0)

没有eval,没有动态的方法可以做到这一点。但是,如果变量没有变化,你可以尝试这样的事情:

var App = (function(fw) {
    var somevar1 = "hello";
    var somevar2 = "world";
    this.get = function(what) {
        switch (what) {
        case "somevar1":
            return somevar1;
        case "somevar2":
            return somevar2;
        }
    }
});