3

変数を暗黙的に呼び出すのではなく、すべての変数を親スコープに設定する習慣があります。

function outer() {
    var x, y;
    function inner() {
        var x = this.x;
        x = ...// doing stuff here
        y = ....// implicit calling parent variable
    }
}

変数を間違って入力した場合、グローバル空間に移動しないようにします。しかし、プライベート関数内で変数を宣言すると、this私が返されるようですundefined:

function f() {
    var x = [0];
    function f1() { 
        console.log('f1:', this.x, x); 
        f2(); 
    }
    function f2() { 
        console.log('f2:', this.x, x); 
    }
    return { x:x , f1:f1 };
}

var foo = f();    
foo.f1();
    //output
    f1: [0] [0]
    f2: undefined [0]

私がそれを正しく理解していれば、 とを使用して外側のスコープにアクセスする必要があるため、発生しないはずf1です。ここで欠けている概念はありますか? それとも、私が今のところ生きなければならないものですか?f2this

f1更新: 明確にするために、私の主な関心事は、 と の間に違いがある理由f2です。f2内部作業を行うため、非表示にしておくことを好みます。また、他の開発者が から何かを宣言するときに使用しないでくださいf()

4

3 に答える 3

4

これも試してください:

function f() {
    var x = [0];
    function f1() { 
        console.log('f1:', this.x, x); 
        f2.call(this); 
    }
    function f2() { 
        console.log('f2:', this.x, x); 
    }
    return { x:x , f1:f1 };
}

var foo = f();    
foo.f1();

このようにして、f2 のコンテキストが適切に設定されます。

f2 はメソッドとして宣言されていないため、コードthis内の f2 は window オブジェクトを参照します。f1 は、書き込み時に返されるオブジェクトのメソッドとして宣言されました{ x:x , f1:f1 }。f2 x では、f() のスコープで実行されるためではなく、f2 がそれをクロージャーとして取得するため、表示されます。つまり、f2 では、作成時に同じスコープにあったすべての変数が表示されます。

が参照するものはthis、呼び出し時に設定されます。関数をオブジェクトのプロパティとして実行するfoo.f1()と、メソッドと見なされthis、オブジェクトに設定されます。しかし、スコープのような関数を呼び出すとf2()、スコープは呼び出されたときと同じになります。あなたの場合、fooはウィンドウオブジェクトのグローバルであるため、ウィンドウオブジェクトです。

f1 では、これは非表示の f() を参照するため、f2 もそのスコープで実行したい場合は、 を使用できますf2.call(this)。.call() の引数はthis、実行時の関数の になります。

于 2013-03-18T21:20:14.123 に答える
0

関数からこれを返しました:

{ x : x, f1 : f1 }

これにより、thisオブジェクトのプロパティが上記に設定されます。f2オブジェクトの一部ではないため、this参照先にアクセスできません。

于 2013-03-18T21:15:44.883 に答える
0

関数がオブジェクトを返す場合、メソッドfはありませんf2f2method は の内部メソッドでfあり、そのスコープ内にのみ存在します。

このコードを使用する場合:

function f() {
    var x = [0];
    function f1() { 

        console.log('f1:', this.x, x); 
        this.f2(); 
    }
    function f2() { 
        console.log('f2:', this.x, x); 
    }
    return { x:x , f1:f1, f2:f2};
}

var foo = f();    
foo.f1();

次にthis、 inメソッドは のメソッドにf1アクセスでき、オブジェクトのメソッドは正しい を返します。f2thisf2x

于 2013-03-18T21:12:24.467 に答える