【问题标题】:replacing eval in privately scoped variables替换私有范围变量中的 eval
【发布时间】:2012-04-03 02:35:55
【问题描述】:

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

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);​

在函数中,我所有正常的“评估清理”选项都不起作用,例如,我不能使用:

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

这肯定不是需要 eval 的奇怪情况吗? .. ps 我必须注意,我不能重新调整 App 内的变量范围,因为它是庞大代码库的一部分。

这里有一些东西可以摆弄:

http://jsfiddle.net/xAVYa/

【问题讨论】:

    标签: javascript jquery eval scope


    【解决方案1】:

    很遗憾,你运气不好; eval唯一可以访问类似变量的东西。下次别这样了:)

    您可以通过保留data 对象来开始迁移:

    var App = (function(fw) {
        var data = {
            somevar1: "hello",
            somevar2: "world"
        };
    
        this.get = function(what) {
            return data[what];
        };
    });
    

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

    【讨论】:

    • 大声笑.....遗憾的是,这是我正在扩展的项目......我自己不会这样做;-)
    【解决方案2】:

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

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

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

    var app = function(fw) {
        this.somevar1 = "hello";
        this.somevar2 = "world";
        this.get = function(what) {
            return this[what];
        }
    };
    
    var app = new App({some: "thing"});
    
    // now for the use:
    console.log(app.get("somevar1"));​
    console.log(app.somevar1);
    console.log(app["somevar1"]);
    

    【讨论】:

    • 问题是“我无法重新调整 App 内的变量,因为它是庞大代码库的一部分”
    • @icktoofay - 我不明白“我无法重新调整 App 内的变量范围”的确切含义,也不明白为什么要对此进行更改会很困难。这是一个相对局部的更改,因为之前只有应用程序对象定义中的代码可以访问 somevar1somevar2(因为它们是该范围的私有),因此在该对象定义中进行简单的搜索和替换将找到其中的任何一个将它们更改为作为属性访问的引用。这不是可以影响远处代码的更改类型。
    • 是的...我想我发现 eval 实际上是我的朋友的罕见情况...重新确定范围可能需要 2 天的扎实工作,因为来自各地的模块都在使用该应用程序。获取函数,还有 app.set app.add 等要关闭这个线程
    • @jfriend00:正如问题所说,App 的定义很大。此外,我们不知道是否有任何函数具有this 而不是App。 (虽然你可以引入一个变量来做到这一点)最后,可能会有很多变量;您必须逐个搜索和替换。
    • @Alex - minitech 的回答让他们保持私密。修复代码的工作量与我相同。奇怪的是变量在原始实现中并不是真正私有的,因为它们可以被任何代码检索。如果只有 .get(),它们是只读的,但您引用了 .set(),所以如果存在,那么它们以前不是私有的。
    【解决方案3】:

    没有 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;
            }
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      相关资源
      最近更新 更多