1

プライベート コンテキスト内で作成された変数にアクセスしたいと思います。私はこのようなプライベートコンテキストを作成しています:

(new Function("var a = 'hello'; console.log('this', this);")).call({});
// outputs -> this Object {}

call空のコンテキストで関数を実行しています。しかし、変数thisを保持していません。aとにかくconsole.log、空のコンテキストでどのように機能する可能性がありますか?

4

1 に答える 1

2

jsFiddle デモ

オブジェクトを作成する関数のスコープ内にvar a存在します。ただし、そのスコープが失われると、変数も失われます。a永続化したい場合は、キーワードthisを使用して作成されたオブジェクトにアタッチする必要があります。

(new Function("this.a = 'hello'; console.log(this);")).call({});

ただし、これは難読化された方法です。ここでは不要な要素があります。主に、newキーワードは必要ありません (Function関数オブジェクトを意味します)。Functionなどのメソッドも付属していcallます。

Function("this.a = 'hello'; console.log(this);").call({});

これも機能します。さらに、変数 a の内容を保持したい場合は、いつでもこれを行うことができます ( demo ):

var obj = {};
Function("this.a = 'hello'").call(obj);
obj.a;//hello

空のコンテキストで機能する理由について。実際には、新しく構築されたオブジェクトを{}. したがって、参照が発生したときに関数内で使用されるスコープですthis。実際、call()スコープを使用するつもりがない場合は、引数は必要ありません。このようなもの:

Function("console.log(5);").call();

5エラーなしでコンソールに記録されます。


あなたの質問で使用されているアプローチは、魔法の文字列から関数を構築することです。このアプローチは非常にクールで、eval と非常によく似ています。しかし、あなたが探しているのは、私が思うこの違いに要約されます:

function ball(){
 var color = "red";
 return color;
}

function Ball(){
 this.color = "red";
}

console.log(ball());//logs red
console.log(new Ball().color);//logs red
于 2013-04-02T00:00:08.380 に答える