検索

ホームページ  >  に質問  >  本文

javascript - 指定された IIFE 内での関数自体の再割り当てについて?

リーリー

関数 foo 内で foo に再割り当てされた 10 はどこに行くのか、また、同じ名前の関数 foo がどのようにして地球規模の汚染を防ぐのかを知りたいのですが、解決して展開してください

ringa_leeringa_lee2824日前917

全員に返信(2)返信します

  • 我想大声告诉你

    我想大声告诉你2017-05-24 11:40:53

    質問者が聞いても大丈夫です。ただし、この問題は練習することで解決できます。 . .

    まず第一に、質問者は IIFE の記述方法に問題はありません。 IIFE の記述方法はたくさんあります。 一般的なもの は @ewind が言ったことです。

    リーリー

    珍しいものもあります:

    リーリー

    それではコードについて話しましょう:
    関数内の現在の関数名に値を代入する場合: foo = 10; 無効です。 (私は @ewind に同意します。ここでは無視されます。もっと合理的な説明があるはずです。) JS パーサーはこれを無視します。
    Chrome コンソールで実行した結果は次のとおりです:

    リーリー

    これは私が上で言ったことを証明します無視
    その後、IIFEはブロックスコープをシミュレートするため、外部環境は内部変数にアクセスできません。つまり未定義です


    @ewind さんは、foo は匿名関数だから、じゃあどうするの?
    明らかに概念が混乱しています。 foo 関数は匿名関数ではありません。

    リーリー

    MDN

    返事
    0
  • 迷茫

    迷茫2017-05-24 11:40:53

    まず第一に、投稿されたコードは不完全です。完全版はこうなるはずです

    リーリー

    var なしで宣言された foo はグローバル スコープを汚染しないため、これは直観に反しているように思えます。

    ただし、関数内で宣言された変数名が foo でない場合は、次のように非常に直感的です:

    リーリー

    では、関数内で宣言された変数が関数名と同じ名前を持つ場合、なぜ問題が発生するのでしょうか?この例を見ることができます:

    リーリー

    すぐに実行される関数の関数名が foo になった後、呼び出し時の argument.callee は実際には foo への参照になります。両者を比較すると、現時点では foo が関数オブジェクトであることがわかります。現時点では、var 宣言のない foo 変数に遭遇した場合、代入操作は有効になりません。インタープリタはこの関数オブジェクトも検索するため、グローバル スコープでの汚染が防止されます。

    返事
    0
  • キャンセル返事