関数 foo 内で foo に再割り当てされた 10 はどこに行くのか、また、同じ名前の関数 foo がどのようにして地球規模の汚染を防ぐのかを知りたいのですが、解決して展開してください
ringa_lee
質問者が聞いても大丈夫です。ただし、この問題は練習することで解決できます。 . .
まず第一に、質問者は IIFE の記述方法に問題はありません。 IIFE の記述方法はたくさんあります。 一般的なもの は @ewind が言ったことです。
珍しいものもあります:
それではコードについて話しましょう: 関数内の現在の関数名に値を代入する場合: foo = 10; 無効です。 (私は @ewind に同意します。ここでは無視されます。もっと合理的な説明があるはずです。) JS パーサーはこれを無視します。 Chrome コンソールで実行した結果は次のとおりです:
foo = 10;
これは私が上で言ったことを証明します無視. その後、IIFEはブロックスコープをシミュレートするため、外部環境は内部変数にアクセスできません。つまり未定義です
@ewind さんは、foo は匿名関数だから、じゃあどうするの? 明らかに概念が混乱しています。 foo 関数は匿名関数ではありません。
MDN
まず第一に、投稿されたコードは不完全です。完全版はこうなるはずです
var なしで宣言された foo はグローバル スコープを汚染しないため、これは直観に反しているように思えます。
ただし、関数内で宣言された変数名が foo でない場合は、次のように非常に直感的です:
では、関数内で宣言された変数が関数名と同じ名前を持つ場合、なぜ問題が発生するのでしょうか?この例を見ることができます:
すぐに実行される関数の関数名が foo になった後、呼び出し時の argument.callee は実際には foo への参照になります。両者を比較すると、現時点では foo が関数オブジェクトであることがわかります。現時点では、var 宣言のない foo 変数に遭遇した場合、代入操作は有効になりません。インタープリタはこの関数オブジェクトも検索するため、グローバル スコープでの汚染が防止されます。
質問者が聞いても大丈夫です。ただし、この問題は練習することで解決できます。 . .
まず第一に、質問者は IIFE の記述方法に問題はありません。 IIFE の記述方法はたくさんあります。 一般的なもの は @ewind が言ったことです。
リーリー珍しいものもあります:
リーリーそれではコードについて話しましょう:
リーリー関数内の現在の関数名に値を代入する場合:
foo = 10;
無効です。 (私は @ewind に同意します。ここでは無視されます。もっと合理的な説明があるはずです。) JS パーサーはこれを無視します。Chrome コンソールで実行した結果は次のとおりです:
これは私が上で言ったことを証明します無視.
その後、IIFEはブロックスコープをシミュレートするため、外部環境は内部変数にアクセスできません。つまり未定義です
@ewind さんは、foo は匿名関数だから、じゃあどうするの?
リーリー明らかに概念が混乱しています。 foo 関数は匿名関数ではありません。
MDN
まず第一に、投稿されたコードは不完全です。完全版はこうなるはずです
リーリーvar なしで宣言された foo はグローバル スコープを汚染しないため、これは直観に反しているように思えます。
ただし、関数内で宣言された変数名が foo でない場合は、次のように非常に直感的です:
リーリーでは、関数内で宣言された変数が関数名と同じ名前を持つ場合、なぜ問題が発生するのでしょうか?この例を見ることができます:
リーリーすぐに実行される関数の関数名が foo になった後、呼び出し時の argument.callee は実際には foo への参照になります。両者を比較すると、現時点では foo が関数オブジェクトであることがわかります。現時点では、var 宣言のない foo 変数に遭遇した場合、代入操作は有効になりません。インタープリタはこの関数オブジェクトも検索するため、グローバル スコープでの汚染が防止されます。