JavaScript上級プログラム設計学習ノート--変数、作用領域とメモリの問題
2808 ワード
転送パラメータ
検出タイプ
変数の値がオブジェクトまたはnullの場合、typeofオペレータは次の例に示すように「object」に戻ります.
次のいずれかのステートメントにストリームが入ると、スコープは延長されます.try-catch文のcatchブロックwith文です.
ブロックレベルのスコープがありません.
function setName(obj){
obj.name="Nicholas";
obj=new object();
obj.name="Greg";
}
var person=new Object();
setName(person);
alert(person.name); //"Nicholas"
関数の中でObjectを再newし、値を「Greg」としますが、関数の外部からname属性にアクセスすると、その値はまだ「Nichollas」となります.実際には、関数の内部にObjectを書き換えると、この変数は一部のオブジェクトを参照します.この局部的なオブジェクトは、関数の実行が終わったらすぐに廃棄されます.検出タイプ
変数の値がオブジェクトまたはnullの場合、typeofオペレータは次の例に示すように「object」に戻ります.
var n=null;
var o=new object();
alert(typeof n); //object
alert(typeof o); //object
スコープの延長次のいずれかのステートメントにストリームが入ると、スコープは延長されます.try-catch文のcatchブロックwith文です.
function buildUrl(){
var qs="?debug=true";
with(location){
var url=href+gs;
}
return url;
}
ここで、with文はlocationオブジェクトを受信するので、その変数オブジェクトにはlocationオブジェクトの属性と方法がすべて含まれています.ブロックレベルのスコープがありません.
if(true){
var color="blue";
}
alert(color);
Cであれば、C+++またはJAVAでは、if文の実行後にカラーは破壊されますが、javascriptではif文の変数宣言が現在の実行環境に変数を追加します.for文を使う時、特にこの違いを覚えておきましょう.for(int i=0;i<10;i++){
doSomething();
}
alert(i); //10