JAvascriptカーネル集約33#6.機能スキャン、Blockスキャン、およびLexicalScope(関数スキャン、ブロックスキャン、LexicalScope)
10894 ワード
Scope
スキャンとは、現在実行中のコンタクトです.
簡単に言えば、現在実行されている関数が持つ範囲です.
(実はサイトごとに人の言うことが違うので、どう言ったらいいか分からないので、そう説明しました.😅)
次に、JavaScriptでスキャンを区別した場合は、大きく2つに分けることができます.
グローバルレンジ
コードはどこにでもあります.
ゾーンスキャン
関数コードブロックで作成されたscope関数自体とサブ関数でのみ参照できます.
var x = 'global';
function foo() {
var x = 'function';
console.log(x);
}
function foo2() {
console.log(x);
}
foo();//'function'
foo2()//'global'
console.log(x);//'global'
2つの変数xが共有されていますが、fooはそのブロックスキャンの「function」をfoo 2は、グローバルスキャンの「global」を
console.log(x)は、グローバルスキャンの「global」を呼び出します.
グローバル宣言変数xは、任意の場所で参照できます.ただし、関数fooで宣言される変数xは、関数fooでのみ参照でき、関数外部では参照できません.
ただしfoo 2では、xは自身のスキャン領域にないため、親領域に入って参照値を検索する.
すなわち、参照変数の識別子は、宣言された位置に基づいて有効な範囲を提供します.
見つけます.JavaScriptは、これらの複雑な範囲を指定する理由は、識別子名の競合を防止し、区別するためです.
1.関数スキャン(function-level scope)
他の言語はブロックレベルの範囲(block-level scope)に従います.ブロックレベルスキャンは、コードブロック({})内の有効なスキャンを表す.
ただし、JavaScriptは関数レベルの範囲(function-level scope)に従います.関数レベルスキャンは、関数コードブロック内で宣言された変数が関数コードブロック内でのみ有効であり、関数外部で参照できないことを示します.if、for、whileなどの他のブロックで宣言された変数は、自動的にグローバル変数として参照されます.
ECMAScript 6のlet、constを追加してブロックレベルスキャンを使用できます!
ECMAScriptはvarではなくletとconstを使用することをお勧めします.
var x = 1;
var y = 15;
function foo() {
var y = 10;
function foo2(){
console.log(y);
}
foo2();
console.log(x);
}
if(true){
var z = 3;
}
foo();//10, 1
console.log(z);//3
console.log(y);//error
2.ブロックスキャン
前述したように、javascriptは関数レベルのスキャンに従うが、ECMAScript 6に追加されたlet、constはブロックスキャンを使用することができる.
const x = 1;
let y = 15;
function foo() {
let y = 10;
function foo2(){
console.log(y);
}
foo2();
console.log(x);
}
if(true){
let z = 3;
}
foo();//10, 1
console.log(z);//error
console.log(y);//15
上記の例と同様ですが、letおよびconstはブロックスキャン規則に従うため、ifブロックで宣言されたzはvarのようにグローバル変数として宣言されず、領域変数としてのみ宣言されます.3.LexicalScope(LexicalScope)
lexical
let name = 'kim';
function func01() {
console.log(name);
}
function func02() {
let name = 'lee';
func01();
}
func02();//name
最初はfunc 02でnameをleeに再割り当てしたのでconsole.「log(name)はleeでしょう」でも.😀関数が「呼び出し」ではなく「宣言」されると、Scopeが作成されます。
これを語彙範囲(Lexic Scopeping)と呼ぶ.
関数を最初に宣言すると、関数内部の変数はミラーに最も近い変数を参照し続けます.func 01宣言では,最近の変数nameの値がグローバルスキャンにおけるkimとなる.したがって、func 02がleeに再割り当てされると、func 01が参照する値は変わらない.
Reference
この問題について(JAvascriptカーネル集約33#6.機能スキャン、Blockスキャン、およびLexicalScope(関数スキャン、ブロックスキャン、LexicalScope)), 我々は、より多くの情報をここで見つけました https://velog.io/@404/자바스크립트-핵심컨샙33-6.-Function-Scope-Block-Scope-and-Lexical-Scope함수-스코프-블록-스코프-렉시컬-스코프テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol