javascriptはモデルのいくつかのテストを実行します.
2047 ワード
一jsのスキャン過程
jsはコードを実行する前に、定義された変数名と関数オブジェクトを取得するためのスキャン(プリコンパイルに相当)のプロセスがあります.主に以下のいくつかの処理ステップを含む.が「var instance=xxx」という語句に遭遇した場合、現在のvariable Objectにこの属性を追加し、undefined を付与する.が関数の定義「function func(){}」に触れた場合、この関数を用いて該当する関数オブジェクトを作成し、varable objectオブジェクトにこの属性funcを追加し、その値は戻りの関数オブジェクトである. この過程を例に挙げて分析します. Global Objectすなわちwindowオブジェクトを初期化し、Varable Objectはwindowオブジェクト自体である. ソースコードをスキャンし、windowオブジェクトにlocal_を追加しました.vとfunc 2属性、値はすべてundefinedです.func 1属性を追加しました.値はこの定義で返された関数オブジェクトです. ソースコードを実行し、local_を実行します.v属性の値は「local v」で、global objectオブジェクトに属性を付けます. global_vは「global v」として割り当てられます. は正確にlocal_をプリントアウトしました.v とglobal_vの値 は、匿名関数オブジェクトを作成し、その値を「func 2」属性に割り当てる. は、func 1()関数を実行し、local_を印刷します.v属性の値 は、func 2()関数を実行し、local_を印刷します.v属性の値 この分析に基づいて、上記のコードの中の1、2をaの上に移動します.3、4をbの上に移動して、もう一度実行します.このとき、第1条の文は「undefined」を印刷し、第2条の文を実行すると「global v is not defined」をエラーとします.これはwindowの対象にもうlocalがあるからです.v属性は、表示されていません.そしてglobal_v属性はまだ存在しません.同じ道理で、第3条の文は結果を正確に出力しました.第4条語句は「func 2 is not a function」と間違えます.このとき、関数オブジェクトとしてfunc 1が割り当てられています.func 2はないです.
jsのこの実行モデルを理解すれば、いくつかの紛らわしい問題を正確に答えられます.
以上のように、実行モデルがよく分からないと、第2条の文は「func」または「inner」を出力すると考えられてしまうかもしれません.
正しい出力結果は、 global undefined inner func第2条ステートメントを実行する前に、inner関数内のvariable ojectでscope chain上のfunc関数内の属性値を新しいx属性値で置換しました.新しい値はこの文にはまだ値が与えられていませんので、印刷された結果は「undefined」です.
jsはコードを実行する前に、定義された変数名と関数オブジェクトを取得するためのスキャン(プリコンパイルに相当)のプロセスがあります.主に以下のいくつかの処理ステップを含む.
// a
var local_v = "local v";
global_v = "global v";
alert(local_v); // 1
alert(global_v); // 2
// b
function func1(){
alert(local_v);
}
var func2 = function(){
alert(local_v);
}
func1(); //3
func2(); //4
上記のコードの実行過程は以下の通りです.jsのこの実行モデルを理解すれば、いくつかの紛らわしい問題を正確に答えられます.
var x='global';
document.writeln(x); // 1
func();
function func(){
var x='func';
function inner(){
document.writeln(x); // 2
var x='inner';
document.writeln(x); // 3
}
inner();
document.writeln(x); // 4
}
以上のように、実行モデルがよく分からないと、第2条の文は「func」または「inner」を出力すると考えられてしまうかもしれません.
正しい出力結果は、 global undefined inner func第2条ステートメントを実行する前に、inner関数内のvariable ojectでscope chain上のfunc関数内の属性値を新しいx属性値で置換しました.新しい値はこの文にはまだ値が与えられていませんので、印刷された結果は「undefined」です.