26

以下に、(他の関数と同様に)ローカルスコープを作成するIIFEがあります。そのスコープ内にparseInt関数があります。これで、ブラウザにはその名前のグローバル関数がすでに存在するため、ローカル関数はグローバルparseInt関数を覆い隠します。IIFE内では、parseIntを呼び出すと、グローバル関数ではなくローカル関数が呼び出されます。(グローバル関数は引き続き。で参照できますwindow.parseInt。)

parseInt('123', 10); // the browser function is called

(function() {

    function parseInt() { return 'overshadowed'; }

    parseInt('123', 10); // the local function is called

})();

parseInt('123', 10); // the browser function is called

これには、デジュリ(ECMAScript仕様)またはデファクト(共通)の名前がありますか?影を落とす?オーバーロード?

4

3 に答える 3

37

正しい用語は[変数]シャドウイングです

コンピュータープログラミングでは、特定のスコープ(決定ブロック、メソッド、または内部クラス)内で宣言された変数が、外部スコープで宣言された変数と同じ名前である場合に、変数のシャドウイングが発生します。この外部変数はシャドウイングされていると言われています...

JavaScriptの関数は、通常の変数(またはプロパティ)と同じスコープチェーン/解決ルールに従う変数(またはプロパティ)内に格納された関数オブジェクトです。これは、オリジナルにもアクセスできる理由を説明してwindow.parseIntいます。この新しいスコープを導入するのは「IIFE」です(JavaScriptで新しいスコープを導入する唯一の方法は関数です)。

ただし、ECMAScript仕様[5th Edition]では、シャドウイングという用語は使用されていません。また、特定の置換用語を見つけることもできません。(基本的なシャドウイング動作は、「10.2.2.1GetIdentifierReference」および関連セクションで定義されています。)

それは過負荷ではなく 、完全に異なるオーバーライドではありません。(このコンテキストでの)オーバーシャ​​ドウがどこで発生したのか、または「通常の」 [可変]シャドウとどのように異なるのかわかりません。この動作を説明するためにシャドウイングという用語がまだ存在していなかった場合、英語の観点からは、シャドウイング(「重要でない/重要でない」)よりもシャドウイング(「を付ける/暗くする」)の方が適切な場合があります。 。

ハッピーコーディング。

于 2011-03-21T04:45:33.387 に答える
10

それが偶然/間違いで起こった場合、あなたはそれをオリジナルを壊しparseInt()ていると呼ぶでしょう。

そうでなければ、私はそれが最近ここスタックオーバーフローでシャドウイングに言及しているのを見たと思います。

于 2011-03-21T02:48:42.503 に答える
4

より一般的には「シャドウイング」と呼ばれます。

于 2011-03-21T02:48:48.907 に答える