これがポイントを追加するアプローチの間違った方法であるかどうか私を許してください。私はずっとここにいるわけではなく、建設的な方向性や批判を歓迎します。
ベンジャミンの答えはOPの質問にうまく対応していますが、巻上げとその奇妙さの完全なツアーを提供する1つの微調整を追加したいと思います。
元のコードをの呼び出しで開始するとf
、次のようになります。
f();
var f = function() {
console.log("Me original.");
};
function f() {
console.log("Me duplicate.");
}
f();
出力は次のようになります。
Me duplicate.
Me original.
その理由は、そのことvar
とfunction
ステートメントがわずかに異なる方法で持ち上げられているためです。
以下のために宣言 *現在のスコープの上部に移動し、任意れる割当var
掲揚されていません。宣言された変数の値に関する限り、元の割り当て行に到達するまでは未定義です。
以下のためfunction
の文、宣言の両方と定義が掲揚されています。関数式、で使用されるvar f = function() {...
構文では巻き上げられません。
したがって、巻き上げ後の実行は、コードが次のようになります。
var f; // declares var f, but does not assign it.
// name and define function f, shadowing the variable
function f() {
console.log("Me duplicate.");
}
// call the currently defined function f
f();
// assigns the result of a function expression to the var f,
// which shadows the hoisted function definition once past this point lexically
f = function() {
console.log("Me original.");
}
// calls the function referenced by the var f
f();
*すべてのJavaScriptスコープは字句スコープ、または関数スコープですが、その時点でfワードを使用すると混乱するように見えました。