どのオブジェクトがこの関数を呼び出すか、この関数の this がこのオブジェクトを指しているという情報をたくさん見てきました。 次の例では、関数 foo がステートメント foo() を通じて呼び出されます。これがグローバル世界を指すのはなぜですか? Window.foo() はグローバル オブジェクトによって呼び出されるのではありませんか? アドバイスをお願いします、ありがとうございます!
上の階で言われたことには問題があります。Foo はグローバル変数ではありません。(非厳密モード) を判断する簡単な方法は次のとおりです。 1. 関数に上位オブジェクトが割り当てられていない場合、これはウィンドウ 2 を指します。関数が割り当てられている場合、上位オブジェクトに関しては、 foo.fn.o() のような、最も近い上位 (親) オブジェクトのみを指します。
コメントに書きましたが、こんな感じです
の場合、正しい設計方法は、内部関数の this をその外部関数に対応するオブジェクトにバインドすることであり、これが上記の問題を引き起こします。 内部函数,即声明在另一个函数体内的函数,都将会绑定到全局对象上,这是JavaScript的设计缺陷
内部函数
全局对象
设计缺陷
を使用できます。コードは次のとおりです: 变量替代的方法,约定俗成,可以使用self或that リーリー
变量替代
self
that
まず第一に、1 つの真実を理解しましょう: 1: 窓もオブジェクトであり、特別なオブジェクトであり、全世界を表します。 次の方法で関数を呼び出す場合: function foo(){....}foo();//2 行目のこの呼び出しメソッド (関数の前に定義したオブジェクトはありません) , これを「グローバルコール」と呼びます。実際、これは window.foo() と同等です。それで、見ましたか?このときのオブジェクトは window であるため、関数をグローバルに呼び出すことは、実際にはオブジェクトに対して関数を呼び出す特殊なケースです。2: では、なぜ上記のコードは obj ではなくグローバルに foo() を呼び出すのでしょうか?コードを変更して 20:
2 つのコードを比較して、違いを見つけてください。
リーリー リーリー
コードは次のように書き換えることができます:
上記の例を通して、関数を呼び出す際に、JavaScript パーサーが call または apply の形式で呼び出されることが理解できます。 このように、関数内でこれに値を指定します。これら 2 つのメソッドの最初のパラメータは、呼び出し時の foo メソッドの内部 this 値です。call メソッドの最初のパラメータが null または未定義の場合、デフォルトでグローバル オブジェクトが最初のパラメータとして使用されます (試してみることもできます)。 foo.call()、foo.call(null)、foo.call(unknown)) を試してください
関数内の関数、このポインタが失われます
上の階で言われたことには問題があります。Foo はグローバル変数ではありません。(非厳密モード) を判断する簡単な方法は次のとおりです。
1. 関数に上位オブジェクトが割り当てられていない場合、これはウィンドウ
2 を指します。関数が割り当てられている場合、上位オブジェクトに関しては、 foo.fn.o() のような、最も近い上位 (親) オブジェクトのみを指します。
コメントに書きましたが、こんな感じです
リーリーの場合、正しい設計方法は、内部関数の this をその外部関数に対応するオブジェクトにバインドすることであり、これが上記の問題を引き起こします。
この設計上の欠陥を回避するには、内部函数
,即声明在另一个函数体内的函数,都将会绑定到全局对象
上,这是JavaScript的设计缺陷
を使用できます。コードは次のとおりです:
变量替代
的方法,约定俗成,可以使用self
或that
リーリーまず第一に、1 つの真実を理解しましょう:
を出力させます リーリー1: 窓もオブジェクトであり、特別なオブジェクトであり、全世界を表します。 次の方法で関数を呼び出す場合:
function foo(){....}
foo();//
2 行目のこの呼び出しメソッド (関数の前に定義したオブジェクトはありません) , これを「グローバルコール」と呼びます。実際、これは window.foo() と同等です。それで、見ましたか?このときのオブジェクトは window であるため、関数をグローバルに呼び出すことは、実際にはオブジェクトに対して関数を呼び出す特殊なケースです。
2: では、なぜ上記のコードは obj ではなくグローバルに foo() を呼び出すのでしょうか?コードを変更して 20:
2 つのコードを比較して、違いを見つけてください。
リーリー リーリー
コードは次のように書き換えることができます:
リーリー上記の例を通して、関数を呼び出す際に、JavaScript パーサーが call または apply の形式で呼び出されることが理解できます。 このように、関数内でこれに値を指定します。これら 2 つのメソッドの最初のパラメータは、呼び出し時の foo メソッドの内部 this 値です。call メソッドの最初のパラメータが null または未定義の場合、デフォルトでグローバル オブジェクトが最初のパラメータとして使用されます (試してみることもできます)。 foo.call()、foo.call(null)、foo.call(unknown)) を試してください
関数内の関数、このポインタが失われます