javascript - 指定された IIFE 内での関数自体の再割り当てについて?
ringa_lee
ringa_lee 2017-05-24 11:38:53
0
2
877
リーリー

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

ringa_lee
ringa_lee

ringa_lee

全員に返信(2)
我想大声告诉你

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

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

リーリー

珍しいものもあります:

リーリー

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

リーリー

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


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

リーリー

MDN

いいねを押す +0
迷茫

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

リーリー

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

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

リーリー

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

リーリー

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

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