スコープ、スコープ チェーン、実行環境、実行環境スタックの概念は、よく混同されますが、ここで整理してみましょう。ローカル スコープ関数内の領域です。 is window;
JavaScript にはブロックレベルのスコープの概念がありません。 : 変数は、宣言されている関数本体とそのサブ関数内で表示されます。
変数が関数内で宣言されていないか、var なしで宣言されている場合、それはグローバル変数であり、グローバル スコープを持ちます。
<script type="text/javascript"> function test1(){ a = 1;//全局变量,只有在当前函数运行时,才有效 } test1(); console.log(a);//1 注意test1函数必须运行,不然找不到a </script>
グローバル変数は、ウィンドウ オブジェクトの属性として使用できます。同じです。
<script type="text/javascript"> var b = 1;//全局变量 console.log(b === window.b); //true 全局变量可以当做window对象的属性用,他们是一样的; </script>
window オブジェクトのすべてのプロパティはグローバル スコープを持ち、コード内のどこからでもアクセスできます。
<script type="text/javascript"> var c = 1;//全局变量// console.log(d);//ReferenceError: d is not defined 引用错误,当前作用域就是最外层作用域,依然找不到d function test2(d){ console.log(c); //1 全局变量,哪都可以访问;(先找当前作用域,找不到,就向外层作用域找,直到window最外层,找到了) console.log(d);//3 形参是局部变量,只有当前作用域下可以访问 } test2(3); </script>
スコープチェーンは、関数が宣言されたときの位置に依存し、現在のスコープで見つからない場合、エンジンは現在のスコープから検索を開始します。外側の層。変数が見つかるか、最も外側のスコープ (つまり、グローバル スコープ) に到達するまで、ネストされたスコープ内で検索を続けます。
そのルートは決定されており、関数が実行される場所とは関係ありません。<script type="text/javascript"> var a = 1; var b = 2; var c = 3; var d = 4; function inner(d) {//它的作用域链是inner---全局 var c = 8; console.log(a);//1 当前作用域找不到a,去全局作用域找到了a=1 console.log(b);//2 当前作用域找不到b,去全局作用域找到了b=2 console.log(c);//8 当前作用域找到了c=8 console.log(d);//7 当前作用域找到了d=7,形参也是局部作用域 // console.log(e);//ReferenceError: e is not defined 引用错误,找不到e, 它的作用域链是inner---全局 console.log(a+b+c+d);//18 } function outter(e) { var a = 5;//inner()的作用域链是inner---全局,所以这个a相当于无效 var b = 6;//inner()的作用域链是inner---全局,所以这个a相当于无效 inner(7); } outter(999);//这个999无效,里面的e根本找不到 </script>
現在の実行環境 (現在のスコープ チェーンにデータと変数を格納する) が変数を見つけられない場合、それは変数が見つからないことを意味し、変数が見つからないことに注意してください。 go to 前の実行環境の検索はスコープチェーンとは異なります
;コードは、グローバル実行環境、グローバル実行環境は環境スタックに置かれます
関数が実行されると、この関数の実行環境が環境スタックの先頭にプッシュされ、その後に前の実行環境が続きます。グローバル実行環境は最初に入力されるため、常に最下位にあります。これはスタックの概念に似ています。
関数が実行された後、その実行環境はスコープ チェーンの最上位から削除されます。 、保存されたデータと関数はマークされてクリアされ、ガベージのリサイクルを待ちます20 行目を実行し、outer(999) 関数を呼び出し、outer(999) 関数実行環境に入り、昇格を宣言し、実パラメータ 999 を仮パラメータ e に渡します。環境内には 2 つの実行環境があります。 stack、outer (999) は現在の実行環境です。
は 16 行目を実行し、次に 17 行目に b=6 を割り当てます。次に、内部 (7) 関数実行環境に入り、プロモーションを宣言し、実パラメータ 7 を仮パラメータ d に渡します。
7 行目を実行し、c=8 を割り当てて、
コードの最適化を実行します。
スコープチェーン上の変数を見つけるにはパフォーマンスが消費されるため、関数が複数のレイヤーにネストされている場合は、関数内で可能な限りローカル変数を使用する必要があります。これはクロススコープ操作であると言えます。関数内でクロススコープ値が複数回使用される場合、それをローカル変数に保存することでパフォーマンスを向上させることができます。以上がJavaScript スコープチェーンと実行環境の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。