2012-04-03 1 views
0

この関数でeval文を削除しようとしています。私はこの[何でも]スタイル置換に慣れていますが、このインスタンスではうまくいきません。 は見ておいてください機能で私的スコープ変数の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が」インスタンスのために働いていない、私が使用カント:

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

確かにこれはどこ奇数の場合ではありませんevalは必要ですか? .. ps私は巨大なコードベースの一部として、私はアプリケーション内の変数を再調査することができないことに注意する必要があります。ここで

をいじるために何か:

http://jsfiddle.net/xAVYa/

答えて

6

残念ながら、あなたは運の出ています。 evalで、そのような変数にアクセスできるのはです。

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

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

そして、ちょうど次第にあなたはそれを参照してください全体のコードベース全体でこれを行う:次の時間は、あなたがdataオブジェクトを保つことによって、移行を開始することができます方法:)

の事をしません。それは何も壊すべきではありません。

+0

lol .....悲しいことに、私は拡張しているプロジェクトです...自分ではできませんでした。 ) – Alex

3

evalなしの文字列名で任意のローカル変数にアクセスすることはできません。だから、app関数の中の他のコードがそれらの変数にどのようにアクセスするかを変更しない限り、eval(と思われるほど醜い)に固執する必要があります。

一方、somevar1somevar2にアクセスするapp()関数内のコードを変更したい場合は、オプションがあります。 .get()関数と同じコントラクトを保つことができるので、app()関数の外では何も変更する必要はありません。これは、これらの変数にアクセスしている可能性のあるプロジェクト内のすべての可能性のある場所をすべて見つけるのは難しくありません。彼らは現在宣言されている方法のため、app()関数内から直接アクセスすることができるので、検索/置換はそのスコープに限定されます。

変数は、オブジェクトのプロパティであるために、それはOKだ場合、あなたはこれを行うことができます:

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

質問は "私は大きなコードベースの一部としてアプリケーション内部の変数を再調査できません" – icktoofay

+3

@icktoofay - 私は "私はアプリケーション内の変数を再調査できません"とは何を理解していないか、ハード。これは相対的にローカルな変更です。アプリケーションオブジェクト定義内のコードだけが 'somevar1'と' somevar2'にアクセスしていた可能性があります(そのスコープに限定されているので)。それらを変更してプロパティとしてアクセスすることができます。これは、離れたコードに影響を与える可能性がある変更の種類ではありません。 – jfriend00

+0

yep ...私はevalが実際に私の友人であるというまれなケースを見つけたと思います...Rescopingは、おそらく2日間の堅実な作業を行うだろう。場所からのモジュールがapp.get関数を使用し、app.set app.addなどでこのスレッドを閉じようとする。 – Alex

0

を評価せずにこれを行うための動的な方法はありません。変数が変わっていない場合は、次のようなことを試すことができます:

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