2012-03-20 9 views
6

変数を取得する方法はありますか。、あなたは.Netでリフレクションできるのですか?
このシナリオのように:変数名を取得します。 javascript "reflection"

function(x,y,z) 
{ 
    if (x === 0) 
     logger.log('variable ' + x.reflectedName ' has invalid value ' + x) 
     // logs: 'variable x has invalid value 0) 
    ... 
} 

私は機能(?!)の外にVARの名前を望んでいた同様の質問が見つかりましたが、この質問を見つけることができませんでした。

(私はそれはそれで行うことができますどのように考えることができないもののjQueryの、オプションです...)

+7

Worthは指摘しています。.NETでのリフレクションによって変数名を取得することはできません。 – StriplingWarrior

+0

@StriplingWarrior。あなたは 'Expression'を使うことができます。私は.Net開発者のために単純化しています... – gdoron

+1

文字列に変数名を記録するのはなぜですか?あなたの例では、 'console.log( '変数xは無効な値:'、x)' – SpYk3HH

答えて

7

あなたは一例として.NETを使用しているので、のはそれに簡単に掘り下げてみましょう。 C#では、あなたはExpressionを取る関数作成することができます。

void BadArgument<T>(Expression<Func<T>> argExpr) 
{ 
} 

をしかし、この関数の呼び出しから変数名を抽出することができるようにするために、あなたはコールを常に使用することを確認する必要があります正確に正しい構文(コンパイル時にこれを強制する方法がないにもかかわらず):

if(x < 0) 
    BadArgument(() => x); 

だから行うことができますが、それは非常に壊れやすいとかなり遅いです。基本的にはラムダ式() => xに基づいて式ツリー全体を作成するための命令を生成しています。呼び出す関数はその式ツリーを解析して引数の名前を見つけようとします。

このようなことはjavascriptで行うことができますか?確かに! JavaScriptで

上記のラムダ式の当量であろうように、クロージャは、内部関数を介して生成される:

function(){return x;} 

とJavaScriptはスクリプト言語であるため、各機能は、独自の定義に相当し文字列として。言い換えれば、上記の機能に.toString()を呼び出すことが得られます:

function(){return x;} 

This jsfiddle showsロギング形式の関数でこれを活用する方法。結果として得られるファンクション文字列を自由に解析することができます。これは、.NET Expression Treeの解析よりもわずかに問題になります。さらに、実際のの値をとしてxにすることは、.NETよりもさらに簡単です:あなたはただcall the functionです!

しかし、あなたそれはあなたのべきを意味するものではありません行うことができという理由だけで。それはジー・達人パーラートリックとして素敵だが、それは右下それに来るとき、それはそれだけの価値はありません。

  • それは壊れやすいです:どのようないくつかの開発者は右のそれを使用して、あなたにその機能を提供していない場合あなたは解析できませんか?
  • それは縮小では動作しません:あなた縮小さ関数は、あなたの変数名を変更したため、変数aが不正な値を持っていたメッセージを取得想像してみてください。
  • これはオーバーヘッドを追加します。function(){return x;}"x"より小さくすることはできません。
  • 最後に、複雑です。 '言っ途切れる。
+0

**優れています!**あなたが提案した通りには使用しませんが、それは素晴らしい答えです!どのような正規表現を 'function(){return x;}'から 'x'を得るために使用しますか? – gdoron

+1

@gdoron:正規表現を使用するかどうかはわかりません。基本的には、 "return"の後と "}"の前にすべてを取って、空白やセミコロンを取り除き、呼び出しコードがあなたにカーブを投げなかったという簡単な祈りをしたいだけです。 – StriplingWarrior

+0

**注意!**あなたの* .jsファイルの変数名が変更される可能性がある場合は、 'minification'について注意してください。 @gromon –

6

あなたがすることはできません。しかし、あなたはすでに変数名を知っているので(文字列の最後に連結するために使用する必要があるので)、なぜそれを入力しないのですか?

すなわち:

logger.log('variable x has invalid value '+x); 
+3

私はこの例が簡単だと思う。私は、変数名があらかじめわかっていない場合にOPがこれをしたいと思っています。しかし、+1は "あなたはできません"。 –

+0

'function(a、b、c)'、 'x'は自分自身の変数で関数を呼び出すとどうなりますか? –

+0

私は 'X'をハードコーディングすることができます知っているが、私は私自身の理由でTOTをしたくない... – gdoron

6

実際にはCANです。ここでは抜粋です:

function getVarName(v) { 
    for (var key in window) { 
     if (window[key] === v) 
      return key; 
    } 
} 
var testvar = 13142; 
function test(t) { 
    var varName = getVarName(t); 
    // window[varName] -- your variable actualy 
    alert(varName); 
} 
test(testvar); // testvar 

あなたは同じ変数が含まれているいくつかのVARSを作成する場合、他の問題があります。最初のvarが返されます。

+5

'var testvar = 13142; var testvar2 = 13142;'または 'var testvar = true;'またはオブジェクトであるものはあなたの一日を滅ぼすでしょう。 Windowsのグローバルスコープで定義されていないものも、あなたの一日を滅ぼすでしょう。 –

-1

また、あなたがで試すことができ

//This is variable you want to get the name 
var prop; 

var obj = {prop}; 
for(var propName in obj){ 
    alert(propName); 
    break; 
} 

変数名を取得することは容易です。

+0

私はあなたが質問を持っているとは思わない。他の回答や質問をもう一度読んでください。関係なくありがとう – gdoron

関連する問題