JavaScript でのこれに関するパズル
代言
代言 2017-06-26 10:52:59
0
7
931

どのオブジェクトがこの関数を呼び出すか、この関数の this がこのオブジェクトを指しているという情報をたくさん見てきました。
次の例では、関数 foo がステートメント foo() を通じて呼び出されます。これがグローバル世界を指すのはなぜですか? Window.foo() はグローバル オブジェクトによって呼び出されるのではありませんか?
アドバイスをお願いします、ありがとうございます!

リーリー
代言
代言

全員に返信(7)
给我你的怀抱

上の階で言われたことには問題があります。Foo はグローバル変数ではありません。(非厳密モード) を判断する簡単な方法は次のとおりです。
1. 関数に上位オブジェクトが割り当てられていない場合、これはウィンドウ
2 を指します。関数が割り当てられている場合、上位オブジェクトに関しては、 foo.fn.o() のような、最も近い上位 (親) オブジェクトのみを指します。

いいねを押す +0
小葫芦

コメントに書きましたが、こんな感じです

リーリー
いいねを押す +0
代言

の場合、正しい設計方法は、内部関数の this をその外部関数に対応するオブジェクトにバインドすることであり、これが上記の問題を引き起こします。 内部函数,即声明在另一个函数体内的函数,都将会绑定到全局对象上,这是JavaScript的设计缺陷

この設計上の欠陥を回避するには、

を使用できます。コードは次のとおりです: 变量替代的方法,约定俗成,可以使用selfthat リーリー

いいねを押す +0
洪涛

まず第一に、1 つの真実を理解しましょう:
1: 窓もオブジェクトであり、特別なオブジェクトであり、全世界を表します。 次の方法で関数を呼び出す場合:
function foo(){....}
foo();//
2 行目のこの呼び出しメソッド (関数の前に定義したオブジェクトはありません) , これを「グローバルコール」と呼びます。実際、これは window.foo() と同等です。それで、見ましたか?このときのオブジェクトは window であるため、関数をグローバルに呼び出すことは、実際にはオブジェクトに対して関数を呼び出す特殊なケースです。
2: では、なぜ上記のコードは obj ではなくグローバルに foo() を呼び出すのでしょうか?コードを変更して 20:

を出力させます リーリー

2 つのコードを比較して、違いを見つけてください。

いいねを押す +0
某草草

リーリー リーリー

いいねを押す +0
曾经蜡笔没有小新

コードは次のように書き換えることができます:

リーリー

上記の例を通して、関数を呼び出す際に、JavaScript パーサーが call または apply の形式で呼び出されることが理解できます。 このように、関数内でこれに値を指定します。これら 2 つのメソッドの最初のパラメータは、呼び出し時の foo メソッドの内部 this 値です。call メソッドの最初のパラメータが null または未定義の場合、デフォルトでグローバル オブジェクトが最初のパラメータとして使用されます (試してみることもできます)。 foo.call()、foo.call(null)、foo.call(unknown)) を試してください

いいねを押す +0
女神的闺蜜爱上我

関数内の関数、このポインタが失われます

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート