JavaScript のレキシカル スコープを理解する
2885 ワード
序章
コードを書いているときに、変数にアクセスしようとすると、
variable is not defined
というエラーがスローされることを思い出してください.しかし、それを定義し、上記の関数で複数回使用したことがはっきりとわかります.それがまさにレキシカルスコープの出番です.レキシカルスコープ
例でこれを理解しましょう:
const name = "Maitra";
function helloWorld() {
console.log("Hello World !! I'm", name);
}
helloWorld(); //Output: Hello World !! I'm Maitra
ここでは、
Global
で変数を宣言しており、多くのネストされた関数内のコード内のどこでも使用でき、引き続き機能します.しかし、その逆は機能しません.function user() {
const userName = "Maitra";
}
user();
console.log("Hello World!! I'm",userName); //Output: Uncaught ReferenceError: userName is not defined
これは、
userName
がグローバル スコープに存在せず、関数ユーザーのレキシカル スコープにのみ存在するために発生します.非常に簡単に言えば、レキシカル スコープとは、特定の変数/関数にアクセスでき、それを使用できるコード内の場所を意味します.
それでは、関数のレキシカル スコープに含まれるすべてのものについて説明しましょう.任意の関数のレキシカル スコープには次の 2 つがあります.
これは、関数が、それ自体とその親で定義されているすべての変数と関数にアクセスできることを意味します.
Lexical Scope = Local Memory + Lexical Scope of Parent
例:
const greetings = "おはようございます!!"
function greetUser() {
const userName = "Maitra"
console.log(greetings, userName)
}
greetUser();//Output: Good Morning !! Maitra
Note
: デフォルトでは、global
はすべての関数の親です.Trivia
: global
にも親があり、 null
を指しているため、プログラムがグローバルの親に到達すると終了します.スコープチェーン
ここで興味深い部分が来ます.関数は、その親変数と関数だけでなく、すべての祖先にもアクセスできます (祖先は親の親です).非常に単純だが効果的な例でこれを理解しましょう.
const a = "This"
function scopeChain() {
const b = "is a"
function x() {
const c = "simple yet"
function y() {
const d = "effective example"
function z() {
const e = "of Scope Chain"
console.log(a,b,c,d,e)
}z()
}y()
}x()
}
scopeChain() //Output: This is a simple yet effective example of Scope Chain
これは、上記の例がどのように機能するかです:
The entire process of searching inside local memory/own lexical scope, if not found then go to parent's lexical scope and repeat is know as Scope Chain
ここで、変数を使用してすべての例を説明したことを思い出してください.ただし、関数は JS の第一級市民であるため、この規則はすべて関数にも適用されます.
知識は共有によって増加する唯一の富であるため、これが役に立ったことを願っています.
Reference
この問題について(JavaScript のレキシカル スコープを理解する), 我々は、より多くの情報をここで見つけました https://dev.to/maitrakhatri/understanding-lexical-scope-in-javascript-4j6oテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol