JavaScript-語法のスコープ
3708 ワード
まず、語法の作用域を静的作用域と呼び、静的作用域と区別する.jsの作用域は語法解析段階ですでに確定しているので、jsの作用域は語法作用域といいます.1.スコープ
2.前倒し宣言
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar();
a.ダイナミックスコープ:静的スコープとは異なり、例えば上記のコードがダイナミックスコープによって解析されると、まずfoo()関数が自身にvalueの値がないことを確認し、彼は関数のスコープ、すなわちbar()から値を検索し、2を印刷する.b.品詞作用領域:jsにとって、上記のコードを実行する場合、まず自身を確認し、その後、関数定義の外層からグローバル変数のvalue値を印刷する.言い換えれば、jsは、解析関数においてすでにvalue記号に対する参照をグローバル変数のvalueに定義している.c.関数のスコープ:まずこれはjs言語であり、自身がブロックレベルのスコープと区別される特性であり、C言語を勉強したことがあると、私たちは{}を通じてコードブロックを表しています.このブロックで定義されている変数はブロック以外のコードで呼び出されません.jsにとって、一つの関数内で定義された変数は一つの関数でもアクセスできます.これは彼の変数宣言の早期特性と関連しています.d.グローバルスコープ:これも関数のスコープと区別する概念です.あとでスコープに言及します.グローバルスコープは作用ドメインチェーン上で最も深い活動対象です.すべてのグローバル変数は属性でグローバルスコープに保存されます.2.前倒し宣言
a.
var foo = function () {
console.log('foo1');
}
foo(); // foo1
var foo = function () {
console.log('foo2');
}
foo(); // foo2
上記の例は、jsに関する変数宣言の前倒し、すなわちjsエンジンのプリコンパイルの際に、変数に対する声明を先に頂上に置くことに関連しています.変数に対する割り当てや操作は含まれていません.実際のコードの実行順序:var foo;
function foo() {
console.log('foo1');
}
foo(); // foo1
function foo() {
console.log('foo2');
}
foo(); // foo2
b.
function foo() {
console.log('foo1');
}
foo(); // foo2
function foo() {
console.log('foo2');
}
foo(); // foo2
関数宣言は、事前に関数宣言の特性でもあります.変数宣言の前に、上記のコードの実際の実行順序に類似しています.function foo() {
console.log('foo1');
}
function foo() {
console.log('foo2');
}
foo(); // foo2
foo(); // foo2