私自身が遭遇した小さな問題です。あなたがそれを持っているかどうかはわかりません。私は最近、匿名関数を書くのが好きです。これを最初に見たとき、習慣的にそれを逆から見て、obj が公開されているだけだと思いました。なぜですか。それは、sayHello を実行するときに、sayHi を実行できますか?
js の実行メカニズムについては以前に見たことがあると思いました。
これが当てはまるかどうかはわかりません:
js は実行時に事前に解析される必要があります
したがって、sayHello が実行される前に、匿名関数の SayHello は
私は専門家ではないので、これが正しい理解かどうかわかりませんが?
これはスコープの問題です。
リーリー関数は作成時にスコープを保存していることに注意してください。コードをこれに変更しても、後でどこで呼び出しても結果は同じになります。以下で簡単に分析できるように、これをすぐに実行します。関数を呼び出して名前を付け、テストと呼びます):
分析、obj.sayHello 関数が作成されると、現在のスコープがすべて保存されます。 リーリー
現時点では、sayHi 関数がテストのスコープ内にあることは明らかなので、この参照は、グローバル スコープで実行されても、グローバル スコープで再定義された SayHi には影響を与えることができません。これは関数のテスト検索からのもので、次の例を見ると理解できます:リーリー
foo関数のスコープはfoo自身+グローバルスコープなので、即時実行関数で実行しても出力値は20ではなく10のみになりますこれはよく理解できません。これはクロージャの概念である必要があります。 http://www.ruanyifeng.com/blo...
関数内の変数にアクセスするときは、まず関数が変数を宣言しているかどうかを確認します。宣言されていない場合は、外側のスコープに移動して見つけます。これは、私が見つけた関数 (function(){})() の場合です。この時点でsayHiが宣言されていない場合は、関数の外側の層でそれを探し続けます。全体の状況を直接見つけても、まだ存在しません。そうすればもう何もありません