2016-09-08 4 views
0

私は長すぎるために私の頭の周りにこれを打ってきました。助けることができる誰にも感謝します!これは、1)console.logのパラメータ名を関数に入れることは可能ですか? 2)文字列を関数の引数として入力しますが、それをオブジェクト参照に変換しますか?

var foo = {key: 'value'}; 

例1:

var stringIntoReference = function(nameOfObject){ 
    console.log(someUnknownCode(nameOfObject)); 
}; 

stringIntoReference('foo'); // logs an object: {key: 'value'} 

例2:最初のため

var referenceIntoString = function(nameOfObject){ 
    console.log(someUnknownCode(nameOfObject)); 
}; 

referenceIntoString(foo); // logs a string: 'foo' 
+1

1、2不可能 –

+0

関連:[私は、文字列として変数名を取得できないのはなぜ?私は自分自身の 'console.log'関数を作成したいと思う](http://stackoverflow.com/q/39260444/218196) –

+1

変数がグローバルスコープにある場合、 'this [nameOfObject]'を試すことができますが、これはひどい練習です。もう1つのオブジェクト(名前空間、基本的に)を作成し、 'foo'をキー' foo'の下に格納する方が良いでしょう。オブジェクトに名前(キー名)でアクセスできます。 – Azamantes

答えて

1

evalは、トリックを行います。任意のコードを実行できるので危険です。

var foo = {key: 'value'}; 
 
var stringIntoReference = function(nameOfObject){ 
 
    console.log(eval(nameOfObject)); 
 
}; 
 
stringIntoReference('foo'); // {key: 'value'}

evalは、あなたがそれを呼び出す場所とは異なる範囲を有していてもよい、stringIntoReferenceであなたの参照を評価することに注意してください。

2番目は本当に可能ではありません。識別子の解決は呼び出しの前に行われ、関数は結果の値のみを受け取ります。さて、あなたは汚いトリックを使用し、プロキシwithステートメントを介してスコープをハイジャックすることができますが、あなたが望むものと正確には思われません。可能

var referenceIntoString = function(nameOfObject) { 
 
    console.log(nameOfObject); 
 
}; 
 
var p = new Proxy({}, { 
 
    has: (_, prop) => prop !== "referenceIntoString", 
 
    get: (_, prop) => prop, 
 
}); 
 
with(p) { 
 
    referenceIntoString(foo); // 'foo' 
 
}

関連する問題