JavaScript学習ノート(一)——変数、スコープとメモリの問題
2621 ワード
変数、スコープ、メモリの問題
データの種類 Udefined Null Boolean Number String(値別アクセス) Object(引用によるアクセス) 基本タイプと参照タイプの値基本タイプの値が簡単なデータセグメントは、スタックメモリに保存されます.typeof検出 参照タイプ値は、複数の値からなるオブジェクトがあり、ヒープメモリに保存されます.instance of検出 他の言語とは使用しません.JavaScriptはメモリ内の位置に直接アクセスすることができません.つまり対象のメモリ空間を直接操作することができません.オブジェクトを操作するときは、実際のオブジェクトではなくオブジェクトの参照を操作します.つまり、参照タイプの値を含む変数は、実際にはオブジェクト自体ではなく、オブジェクトを指すポインタが含まれています.
変数値をコピー基本タイプ値:相互独立 参照タイプ値:2つの変数は実際に同じオブジェクトを参照し、コピーされた値のコピーは実際にはポインタであるため、変数の一つを変更すると他のオブジェクトに影響を及ぼします.
実質とは、関数の外部の値を関数内部のパラメータにコピーすることです.
1.実行環境
各関数は自分の実行環境を持っています.実行ストリームが関数に入ると、関数の環境が環境スタックに押し込まれます.関数が実行された後、スタックはその環境をイジェクトし、制御権を前の実行環境に戻す.
2.作用ドメインチェーンコードが環境で実行されると、変数オブジェクトの作用ドメインチェーンが作成されます. 作用分域チェーンの用途は、実行環境にアクセスできるすべての変数と関数に関する規則的なアクセスを保証することである. 内部環境は、作用ドメインチェーンを介してすべての外部環境にアクセスできますが、外部環境は内部環境内の任意の変数および関数にアクセスできません. 作用領域の変数は上にしかアクセスできません.変数の反転チャネルwindowオブジェクトは終了されます.作用ドメインチェーンの下に変数がアクセスできないのです. 3.スコープの延長 try-catch文のcatchブロックは、新たな変数オブジェクト を作成する. with文は、指定されたオブジェクトを作用領域チェーンに追加する .
4.ブロックレベルのスコープがなく、グローバルと関数の二つのスコープだけがあります.
5.関数が初めて呼び出された時に何が起きましたか?
ある関数が最初に呼び出された時に、実行環境と対応する作用ドメインチェーンを作成し、作用ドメインチェーンを特殊な内部属性にコピーします.を選択して、関数のアクティブオブジェクトを初期化するために、this、argments、および他のネーミングパラメータの値を使用します.しかし、スコープの終点であるグローバル実行環境までは、外部関数の活動オブジェクトは常に第二位にあります.
5.クエリー識別子
検索中に局所的な変数定義があると、検索は自動的に停止され、他の変数オブジェクトには入らなくなります.
原理:もう使用しない変数を探し出して、メモリの占有を解放します.
ごみ収集器はどの変数が役に立つかを追跡しなければなりません.将来的にメモリを回収するために、もう役に立たない変数にマークを付けます.
ポリシーを識別するタグクリア 参照カウントサイクル参照 メモリの管理
参照を解除すると、不要なデータの値がnullに設定されて参照が解放されます.参照の真の作用を解除すると、実行環境から値を逸脱させて、ゴミ収集器が次の運転時に回収されます.
データの種類
変数値をコピー
var num1 = num2 = 5;
num2 = 3;
console.log(num1); //5
console.log(num2); //2
var ob1 = ob2 = new Object();
ob1.name = "ob1";
ob2.name = "ob2";
console.log(ob1.name); //"ob2"
console.log(ob2.name); //"ob2"
転送パラメータ実質とは、関数の外部の値を関数内部のパラメータにコピーすることです.
function setName(obj){
obj.name = "Jay";
obj = new object(); //obj ,
obj.name = "yyy";
}
var man = new Object();
setName(man);
console.log(man.name); //"Jay"
実行環境とスコープチェーン1.実行環境
各関数は自分の実行環境を持っています.実行ストリームが関数に入ると、関数の環境が環境スタックに押し込まれます.関数が実行された後、スタックはその環境をイジェクトし、制御権を前の実行環境に戻す.
2.作用ドメインチェーン
4.ブロックレベルのスコープがなく、グローバルと関数の二つのスコープだけがあります.
5.関数が初めて呼び出された時に何が起きましたか?
ある関数が最初に呼び出された時に、実行環境と対応する作用ドメインチェーンを作成し、作用ドメインチェーンを特殊な内部属性にコピーします.を選択して、関数のアクティブオブジェクトを初期化するために、this、argments、および他のネーミングパラメータの値を使用します.しかし、スコープの終点であるグローバル実行環境までは、外部関数の活動オブジェクトは常に第二位にあります.
if(true){
var result = "true";
}
for(var i = 0; i < 10; i++){
console.log(" " + i);
}
console.log(result); // "true"
console.log(i); //10
初期化された変数がvarで宣言されていない場合、自動的にグローバル環境に追加されます.5.クエリー識別子
検索中に局所的な変数定義があると、検索は自動的に停止され、他の変数オブジェクトには入らなくなります.
var color = "blue";
function getColor(){
var color = "red";
return color;
}
console.log(getColor()); //red
ごみの収集原理:もう使用しない変数を探し出して、メモリの占有を解放します.
ごみ収集器はどの変数が役に立つかを追跡しなければなりません.将来的にメモリを回収するために、もう役に立たない変数にマークを付けます.
ポリシーを識別する
参照を解除すると、不要なデータの値がnullに設定されて参照が解放されます.参照の真の作用を解除すると、実行環境から値を逸脱させて、ゴミ収集器が次の運転時に回収されます.