1. ホーム
  2. javascript

[解決済み] なぜ私のJavaScriptの関数名は衝突するのでしょうか?

2023-01-19 21:41:02

質問

ある変数と、ある関数が代入されている関数とが名前を衝突させるとどうなるかを見るために、次のようなスクリプトを書きました。

var f = function() {
    console.log("Me original.");
}

function f() {
    console.log("Me duplicate.");
}

f();

出力されるのは "私オリジナル." なぜ他の関数が呼ばれなかったのでしょうか?

また、元の割り当てを var f = new function() { に変更すると、"Me original" が表示され、その後に TypeError が表示されます。 object is not a function . 誰か説明してください。

どのように解決するのですか?

JavaScriptでは関数宣言はhoisted(先頭に移動)されます。パース順は間違っていますが、関数宣言はホイストされているので、あなたのコードは意味的には次のコードと同じです。

function f() {
    console.log("Me duplicate.");
}
var f = function() {
    console.log("Me original.");
}


f();

というのは、順番に、関数の名前を除いて同じです。

var f = function() {
    console.log("Me duplicate.");
}
var f = function() {
    console.log("Me original.");
}


f();

と同じになるのは、可変ホイストのせいです。

var f;
f = function() {
    console.log("Me duplicate.");
}
f = function() {
    console.log("Me original.");
}

f();

これは、関数をオーバーライドしていることを説明しています。より一般的には、複数の var の宣言は、JavaScript では許可されています。 var x = 3; var x = 5 は完全に合法です。新しい ECMAScript 6 標準では let ステートメントがこれを禁じています。

この記事 は、javascript の関数を理解する上で素晴らしい仕事をしています。