замена eval в приватных переменных - PullRequest
0 голосов
/ 03 апреля 2012

Я пытаюсь удалить оператор 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);

, конечно, это неСтранный случай, когда eval необходим?.. ps Я должен заметить, что я НЕ МОГУ перекопать переменные внутри приложения, так как это часть огромной кодовой базы.

Здесь есть что поиграть:

http://jsfiddle.net/xAVYa/

Ответы [ 3 ]

6 голосов
/ 03 апреля 2012

К сожалению, вам не повезло;eval - это единственное, что может обращаться к таким переменным .В следующий раз не делайте так:)

Вы можете начать миграцию, сохранив объект data:

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

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

И просто постепенно делайте это по всей базе кода, гдеты видишь это.Это ничего не должно сломать.

3 голосов
/ 03 апреля 2012

Вы не можете получить доступ к произвольной локальной переменной по имени строки без eval.Так что, если вы не хотите изменить способ доступа к этим переменным из другого кода внутри функции app, вам придется придерживаться eval (как бы ужасно это не казалось).

Если нас другой стороны, вы готовы изменить код внутри функции app(), которая обращается к somevar1 и somevar2, тогда у вас есть варианты.Обратите внимание, что вам не нужно ничего менять за пределами функции 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"]);
0 голосов
/ 03 апреля 2012

Не существует динамического способа сделать это без 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;
        }
    }
});
...