1

私はこのコードを持っています

var f = function() {
    this.x = 100;
    (
        function() {
            x = 20;
        }
    )();
};

var a = new f;
console.log(a.x);

なぜ新しい変数 x がグローバル スコープで作成され、出力が 20 ではなく 100 になるのか疑問に思っています。

変数 x = 100;

ネストされた関数は同じ x の値を変更します。経由で x を作成しているようです

this.x = 100

x を関数 f のスコープ外に置きます。その場合、どこで定義されていますか? また、どのようにアクセスできますか?

編集: タイプミスを修正: console.log(x) の代わりに console.log(ax)

4

5 に答える 5

4

ステートメント:

this.x = 100;

現在のスコープに変数を作成せず、参照するxオブジェクトにプロパティを設定しますthis。あなたの場合、thisによってインスタンス化されたばかりのオブジェクトでありnew f、 によって返されf、 に割り当てられるのと同じオブジェクトですa

あなたが言う時:

x = 20;

JavaScript はx現在のスコープで を探しますが、見つからないため、グローバル スコープに到達するまで次のスコープを検索します。アクセス可能なスコープで見つからない場合はx、ご覧のように新しいグローバル変数を作成します。

ネストされた関数内からプロパティにアクセスするにxは、通常、参照をローカル変数に格納しthis、ネストされた関数がその変数を参照できるようにします。

var f = function() {
    var self = this;       // keep a reference to this

    this.x = 100;
    (
        function() {
            self.x = 20;   // use the self reference from the containing scope
        }
    )();
};

var a = new f;
console.log(a.x);          // will now be 20

それを行うもう 1 つの方法は、内部関数を参照することです。ただし、(外部)関数と同じになるように明示的に設定できるように、メソッドthis.xを介して内部関数を呼び出します。.call()thisf

var f = function() {
    this.x = 100;
    (
        function() {
            this.x = 20;
        }
    ).call(this);
};

var a = new f;
console.log(a.x);

参考文献:

于 2012-02-12T11:04:42.147 に答える
1

ネストされた匿名サブ関数のメンバー関数を変更する場合は、次のように、スコープ内で「this」へのポインターを作成することをお勧めします。

var f = function() {
    this.x = 100; // set the member value
    var self = this; // pointer to the current object within this function scope
    (
        function(){
            self.x = 20; // 'self' is in scope
        }();
    )();
};

var a = new f;

console.log(a.x); // Output: 20
于 2012-02-12T10:27:24.303 に答える
1
var f = function() {

    this.x = 100;
    console.log(this);
    // f

    (function() {
      console.log(this);
      // DOMWindow. So x is a property of window because you're not declaring it with var
      x = 20;
    })();
};

無名関数の積を のスコープに割り当てたい場合はf、次のように動作します。

var f = function() {
    this.x = (function() {
      var x = 20; // Local scope
      return x;
    })();
};

console.log( (new f().x) );
于 2012-02-12T09:43:12.420 に答える
1

JavaScript では、変数には関数レベルのスコープがあります。また、これ:

this.x = 100;

とは異なります:

x = 20;

後のケースでxは、グローバルな(var以前は使用していなかった)スコープがあるためです。たとえば、windowオブジェクトの一部になります。


また、あなたがやっているとき:

var a = new f;
console.log(x);

次の方法でグローバル変数xセットにアクセスしてx = 20;いますが、次のことを行う必要があります。

var a = new f;
console.log(a.x);
于 2012-02-12T09:30:53.323 に答える
0

なしで変数を宣言するvarと、変数はグローバル スコープになります。

于 2012-02-12T09:30:55.903 に答える