JSを実行するコンテキスト-関数宣言文と関数式
この文章.📕Core JavaScriptベースの記事です.
この文章.👇古いポスター👇および.
JSを実行するコンテキスト-環境記録とエスケープ
💡 関数宣言文と関数式
この文章.👇古いポスター👇および.
JSを実行するコンテキスト-環境記録とエスケープ
💡 関数宣言文と関数式
関数宣言文と関数式がコード作成にどのように関連しているかを理解する前に、関数宣言文と関数式について説明します.
関数宣言(function declaration)と関数式(function expression)は、関数を再定義する方法です.
関数宣言は、関数定義子のみが存在し、個別の付与コマンドが存在しないことを示し、関数式は、定義された関数を個別の変数に割り当てることを示します.function a(){...} // 함수 선언문. 함수명 a가 곧 변수명
a(); // 실행 OK
var b = function(){...} // (익명)함수 표현식. 변수명 b가 곧 함수명
b(); // 실행 OK
var c = function d(){...} // 기명 함수 표현식. 변수명은 c, 함수명은 d
c(); // 실행 OK
d(); // 에러!
📌 関数名を定義する関数式を記名関数式と呼びます.
記名関数式は、外部から関数名で関数を呼び出すことはできません.
上記の例では、c関数の内部では、c()呼び出しでもd()呼び出しでもうまく動作するため、関数の内部で再帰関数を呼び出すために使用することができる.
ただし、c()で呼び出すことができる場合は、d()で呼び出す必要はありません(結論はあまり使いにくい)
関数宣言文と関数式の実質的な違い
ソースコードの例
console.log(sum(1, 2));
console.log(multiply(3, 4));
function sum(a, b) { // 함수 선언문 sum
return a + b;
}
var multiply = function (a, b) { // 함수 표현식 multiply
return a * b;
};
実行コンテキストのlexicalEnvironmentは、環境記録の情報収集中に発生した状況を説明する2つの情報を収集します.
完了した照準
// 함수 선언문은 전체를 호이스팅 한다.
var sum = function sum(a, b) {
return a + b;
};
// 변수는 선언부만 끌어올린다.
var multiply;
console.log(sum(1, 2));
console.log(multiply(3, 4));
// 변수의 할당부는 원래 자리에 남겨둔다.
multiply = function (a, b) {
return a * b;
};
関数宣言文は全体的に明るくなり、関数式は変数宣言子のみが明るくなります.
関数は値としても使用できます.
関数を他の変数に値として割り当てます.これが関数式です.
上のコードを実行
以下の結果が得られたsum(1,2)
は正常に動作し、3を出力します.
Multiに値が割り当てられていないため、エラーメッセージ「Multi is not a function」が出力され、実行時間が終了します.
関数宣言のリスク
上記の例のsum
関数は、宣言前に呼び出されても問題はありません.
どのように作成しても間違いがない面では、初級者がJSにアクセスしやすい面もありますが、逆に大きな混乱を招くこともあります.
例えば、開発者Aが文書の100行目にsum
という関数を記述しているとする.
新しく入社した開発者Bが同じファイルの5000行にsum
関数を新たに宣言した場合?
グローバルコンテキストがアクティブな場合、グローバル空間に宣言されたすべての関数が一番上に引き寄せられます.
同じ変数名に異なる値を割り当てると、後で割り当てられた値は以前に割り当てられた値(override)を上書きします.
開発者AとBがsum
関数を関数式として定義したらどうなりますか?
5000行目まではAの意図、5000行目以降はBの意図で正常に動作するはずです.
🙄 このようなことを避けるために、関数式を使う習慣を身につけてください.
Reference
この問題について(JSを実行するコンテキスト-関数宣言文と関数式), 我々は、より多くの情報をここで見つけました
https://velog.io/@2seunghye/JS-실행-컨텍스트-함수-선언문과-함수-표현식
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
function a(){...} // 함수 선언문. 함수명 a가 곧 변수명
a(); // 실행 OK
var b = function(){...} // (익명)함수 표현식. 변수명 b가 곧 함수명
b(); // 실행 OK
var c = function d(){...} // 기명 함수 표현식. 변수명은 c, 함수명은 d
c(); // 실행 OK
d(); // 에러!
console.log(sum(1, 2));
console.log(multiply(3, 4));
function sum(a, b) { // 함수 선언문 sum
return a + b;
}
var multiply = function (a, b) { // 함수 표현식 multiply
return a * b;
};
// 함수 선언문은 전체를 호이스팅 한다.
var sum = function sum(a, b) {
return a + b;
};
// 변수는 선언부만 끌어올린다.
var multiply;
console.log(sum(1, 2));
console.log(multiply(3, 4));
// 변수의 할당부는 원래 자리에 남겨둔다.
multiply = function (a, b) {
return a * b;
};
Reference
この問題について(JSを実行するコンテキスト-関数宣言文と関数式), 我々は、より多くの情報をここで見つけました https://velog.io/@2seunghye/JS-실행-컨텍스트-함수-선언문과-함수-표현식テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol