2

this関数が動作する現在のオブジェクトを指していることを知っています。だからここに定義によるコードがあります

function foo(){
    alert(this); //output==window
}

したがって、関数fooはwindow.foo()と同じですが、ここにあります

function foo(){
    function fo(){
        alert(this);
    }
    fo();
}

では、foo実行されると、出力が再びウィンドウオブジェクトになるのはなぜですか?ネストされた関数は別のオブジェクトを参照する必要があるため、thisfo()はfoo()== window.foo()としてウィンドウオブジェクトを操作していないため、ネストされた関数は別のオブジェクトを指すようになります。

詳細については、こちらをご覧ください。

 function foo()
{
alert(this);
  function fo(){alert(this);}
as();
}

もし今なら、var x = new foo(); foo()メソッド内の "this"はオブジェクトオブジェクトを指しますが、ネストされたthisはグローバルオブジェクトを指しますか?

4

4 に答える 4

5

hereで説明されているように、キーワードthisは「.」の左側にあるオブジェクトに動的にバインドされます。通話時。上記には 3 つの例外があります。

  1. .キーワードがない場合this、グローバル オブジェクト ウィンドウにバインドされます。
  2. call と apply を使用すると、何thisにバインドするかを決定できます。
  3. キーワード new を使用してコンストラクターから新しいインスタンスを作成する場合、キーワードthisは新しく生成されたインスタンスを参照します。

ここから、まだ単に を呼び出しているのでfo()thisは にバインドされていwindowます。

于 2013-01-04T12:50:08.150 に答える
2

二つのこと....

まず、コンソールの使用を検討する必要があります。( console.log(this);)。

2 つ目は、クロージャとスコープの違いです ( this)。

閉鎖:

function a() {
    function b() {
        // b is only available inside `a`
    } 
}
// so out here b will be undefined

範囲:

function a() {
    // in here the scope can be multiply things depending on how the function is called. See below
    console.log(this);
}

window関数がオブジェクトのメソッドである場合、スコープはオブジェクトを参照します。

a(); // logs: window

var o = { 
    a: a
};
o.a(); // logs: { a: a }

このデフォルトの動作は、ether call または apply を使用して上書きできます。

var s = [1, 2, 3]
a.call(s); // logs: [1, 2, 3]
// or using apply
a.apply(s) // logs: [1, 2, 3]
于 2013-01-04T12:51:39.147 に答える
1

this値は、関数の定義方法ではなく、関数の呼び出し方法によって異なります。次の機能がある場合:

var test = function() {
  console.log(this);
};

次に、それを呼び出す方法は多数あります。

  • test()- そうなるwindow
  • new test()- インスタンスになります
  • ({ foo: test }).foo()- オブジェクトになります
  • test.call(bar)- そうなるbar

関数がネストされているかどうかは問題ではありません。

于 2013-01-04T12:50:00.573 に答える
0

プログラミング、あなたは間違っています。

オブジェクトの関数を作成するには、次のようにする必要があります。

function foo(){
    this.fo = function(){
       alert(this);
    }
}
f = new foo();
f.fo();

オブジェクト宣言で fo 関数がどのように開始されるかを確認しますか?

今、あなたがf.fo()得るとき[object Object]

于 2013-01-04T12:49:51.383 に答える