関数宣言vs関数式


関数宣言vs関数式


関数宣言には、関数定義子のみが存在し、個別の割り当てコマンドはありません.
関数式は、定義された関数を個別の変数に割り当てます.
関数宣言文の場合は、関数式を必要とせずに関数名を定義する必要があります.
関数名を定義する関数式は「記名関数式」と呼ばれ、定義されていない関数式は「匿名関数式」と呼ばれ、通常、関数式は匿名関数式を指します.
function a () { } // 함수 선언문. 함수명 a가 곧 변수명.
a(); // 실행 OK.

var b = function () { } // (익명) 함수 표현식. 변수명 b가 곧 함수명.
b(); // 실행 OK.

var c = function d () { } // 기명 함수 표현식. 변수명은 c, 함수명은 d.
c(); // 실행 OK.
d(); // 에러.(c 함수 내부에서는 호출 가능)
関数宣言文と関数式の最大の違いは、エスケープ時に発生します.
💡 ハウスティンとは何ですか.
コードを実行すると、JavaScriptは現在実行されているコンテキスト全体を最初から最後まで巡回し、識別子情報を順番に収集します.(パラメータの名前、関数宣言、変数名など)これにより、JavaScriptエンジンは、コードが実行される前に、その環境内のすべてのコード変数名を知っていたにもかかわらず.この現象は容易に理解でき、「javascriptエンジンは識別子を最上位に引いて実際のコードを実行する」と考えられ、ここでは「引く」リフトにingを加えてhostingの概念が現れた.
サンプルコードで確認してみましょう.
console.log(sum(2,5));
console.log(multiply(3,4));

// 함수 선언문 sum
function sum (a, b) {
	return a + b;
}

// 함수 표현식 multiply
var multiply = function (a, b) {
	return a * b;
}
上のコードをハイライト状態に変更します.
function sum (a, b) { // 함수 선언문은 전체를 호이스팅한다.
	return a + b;
}

var multiply; // 변수는 선언부만 끌어올린다.

console.log(sum(2,5));
console.log(multiply(3,4));

multiply = function (a, b) { // 변수의 할당부는 원래 자리에 남겨둔다.
	return a * b;
}
関数宣言は関数全体をマスクし、関数式は変数宣言子のみをマスクします.すなわち,関数は1つの値として扱うこともできる.
上記のコードを実行すると、sum関数が宣言前に呼び出されても問題はありません.これは、どこで作成してもエラーが発生しないため、初級ユーザーはjavascriptにアクセスしやすくなりますが、これも大きな混乱の原因です.人間は「宣言後に呼ぶことができる」と自然に思っているからだ.
それ以外にも,関数宣言が混乱した概念であることが原因である.例を挙げる.
匿名の開発者は、巨大なJavaScriptファイルの100行目に関数を宣言し、その関数をあちこちで呼び出します.ただし、3,000行目で同じ名前の関数を再宣言して、既存の設定とは異なる内容を返すとします.
グローバルコンテキストがアクティブな場合、グローバル空間に宣言されたすべての関数がハイライトされます.したがって、コードを実行するときに実際に呼び出される関数は、最後に割り当てられた関数のみです.そのため、上記の場合、プログラムに問題があちこちに発生します.しかし、実際には、この関数にはエラーは発生しません.
関数を関数式として定義するとどうなりますか?3000行までは既存の関数に従って、3000行以降は後で宣言する関数の内容に従って操作します.また、100行目の前に関数を呼び出すコードがあれば、その行でエラーが検出されるため、より短い時間でデバッグを容易に行うことができます.

整理する


まとめると、関数宣言式は関数式に比べて多くの混乱を引き起こす.
1つ目の理由は、宣言前にも呼び出せるので拒否感が生じるからです.
2つ目の理由は、関数宣言式が問題になりやすいためです.関数全体が呼び出され、最後に割り当てられた関数のみが呼び出されるためです.
したがって、スムーズなコラボレーションのために、グローバルスペースで関数を宣言したり、同じ名前の関数を繰り返し宣言したりしてはいけません.
また、関数宣言を使用するよりも関数式を使用する方が役立ち、このような状況を回避できます.
参考資料
コアJavaScript