JavaScriptノート:変数、スコープとメモリの問題

9961 ワード

ECMA-622の定義によって、javascriptの変数は他の言語の変数とは大きな違いがあります.javascript松散変数の本質は、特定の時間内に特定の値の名前を保存しているだけであることを決定しました.変数が存在しないので、特定のタイプの値を保存するルールが必要です.変数の値とタイプはスクリプトのライフサイクル内で変更できます.
1、基本タイプと参照タイプの値
ECMAScript変数は、基本タイプと参照タイプの2つの異なるデータタイプの値を含むことができます.基本タイプの値は単純なデータセグメントを指し、参照タイプの値は複数の値からなる可能性のあるオブジェクトを意味します.基本的なデータタイプは、Udefined Null Boolean Number Stringを含みます.は値でアクセスします.参照タイプの値はメモリに保存されているオブジェクトです.他の言語と違って、JavaScriptはメモリ内の位置に直接アクセスすることができません.つまり、オブジェクトの記憶空間を直接操作することができません.オブジェクトを操作するときは、オブジェクトではなく操作対象の参照です.
1、ダイナミックな属性
参照タイプにのみ属性を追加できます.基本タイプの属性はアクセスできません.
var person = new Object(); 
person.name = "Nicholas"; 
alert(person.name); //"Nicholas"

var name = "Nicholas";
name.age = 27;
alert(name.age);      //undefined
2、変数値をコピーする
引用タイプのコピーはアドレスをコピーしただけで、このメモリへの参照が多くなります.
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name);  //"Nicholas"
3、伝達パラメータ
ECMAScriptのすべての関数のパラメータは値伝達されます.基本型の値をパラメータに渡すと、渡された値はローカル変数に割り当てられます.パラメータに参照タイプの値を渡すと、この値はメモリ内のアドレスをローカル変数にコピーしますので、この局所変数の変化は関数外に反映されます.例:
function addTen(num) {
    num += 10;
    return num; 
}
var count = 20;
var result = addTen(count); 
alert(count); //20
alert(result); //30

function setName(obj) {
    obj.name = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name);    //"Nicholas"

//     
function setName(obj) { 
    obj.name = "Nicholas"; 
    obj = new Object(); 
    obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name);    //"Nicholas"
4、検出タイプ
var s = "Nicholas";
var b = true;
var i = 22;
var u;
var n = null;
var o = new Object();
alert(typeof s);
alert(typeof i);
alert(typeof b);
alert(typeof u);
alert(typeof n);
alert(typeof o);
//     
//string
//number
//boolean
//undefined
//object
//object
typeofは基本データのタイプを検出するのに良いヘルパーですが、引用タイプについてはinstance ofメソッドを使用します.
alert(person instanceof Object);   
alert(colors instanceof Array);
alert(pattern instanceof RegExp); 
もちろん、instanceでベースタイプを検出すると、常にfalseに戻ります.
2、実行環境とスコープ
実行環境は、JSの中で重要な概念です.実行環境は、関数または変数がアクセスできる他のデータを定義します.
ウェブブラウザでは、グローバル実行環境はwindowオブジェクトとして認識されている.
実行環境のコードはすべて実行済みで、この環境は破壊されました.コードと関数も破壊されました.
各関数は自分の実行環境を持っています.フローが関数に入ると、関数の環境が環境スタックに押し込まれます.関数が実行された後、環境がスタックからイジェクトされ、コントロールを前の環境に戻します.
コードが環境で実行されると、変数オブジェクトの作用ドメインチェーンが作成されます.作用するドメインチェーンの役割は、実行環境にアクセスできる変数と関数の秩序的なアクセスを保証することである.
識別子解析は、スコープのレベル1に沿って識別子を検索するプロセスである.検索プロセスは、ドメインチェーンの先頭から(現在実行されている環境)、識別子が見つかるまでは、見つからない場合は、通常エラーが発生します.例:
var color = "blue";
function changeColor(){
    var anotherColor = "red";
    function swapColors(){
        var tempColor = anotherColor;
        anotherColor = color;
        color = tempColor;
        //    color anotherColor tempColor 
    }
    //   color anotherColor,    tempColor
    swapColors();
}
//    color 
changeColor();
1、作用ドメインチェーンを延長する
次のいずれかのステートメントにストリームが入ると、スコープは長くなります.1、try-catch文のcatchブロック2、with文
function buildUrl() {
    var qs = "?debug=true";
    with(location){
        var url = href + qs;
    }
    return url; 
}
2、ブロックレベルのスコープがない
他の言語では、括弧で囲まれた部分は独立した実行環境であり、括弧内の文が実行された後、定義された変数は破棄されます.しかし、JSはブロックレベルの作用領域の概念がないので、以下のようなコードもエラーが発生しません.
if (true) {
    var color = "blue";
}
alert(color);    //"blue"

for (var i=0; i < 10; i++){
    doSomething(i);
}
alert(i);      //10
1、変数を宣言する
var宣言を使用する変数は、最近の実行環境に自動的に追加されます.初期化時にvar宣言を使用しないと、変更量は自動的にグローバル変数に追加されます.
2、クエリー識別子
クエリの順序は、スコープに沿って上へ検索されます.
//     1
var color = "blue";
function getColor(){
    return color;
}
alert(getColor());  //"blue"

//     2
var color = "blue";
function getColor(){
    var color = "red";
    return color;
}
alert(getColor());  //"red"
3、ゴミ収集
JSは自動ごみ整理の仕組みを持っています.つまり、実行環境はコード実行中のメモリを管理します.このようなごみ収集の仕組みの原理は実はとても簡単です.もう使わない変数を探し出して、それらの占用メモリを釈放します.このため、ゴミ収集器は周期的にこの操作を行います.
1、マーククリア
JSで一番よく使われているごみの収集方法はマーククリアです.変数が環境に入ると、変数は環境に入るとマークされます.変数が環境から離れると、「離れ」としてマークされます.ごみ収集器は、実行中にすべてのメモリの変数にマークを付けます.環境内の変数と環境中の変数によって参照される変数のマークを削除します.この後、マークを付けた変数は、環境内の変数がこれらの変数にアクセスできなくなりましたので、削除を準備する変数と見なされます.最後に、ゴミ処理機はメモリの整理作業を完了し、マーク付きの値を廃棄し、それらの記憶空間を回収する.
2、参照カウント
引用数はあまり見られないごみ収集戦略である.参照カウントのポリシーは、各値が参照される回数を追跡記録することである.変数の参照カウントが0の場合、変数にアクセスできなくなったことを示します.変更量は回収されます.
3、メモリの管理
ごみ収集の仕組みを備えた言語を使ってプログラムを作成します.開発者はメモリ管理の問題を心配しなくてもいいです.しかし、最小のメモリを使用することで、ページのパフォーマンスを向上させることができます.メモリの占有を最適化する一番いい方法は、実行中のコードのために最低のデータだけを保存することです.データが使用されなくなると、nullに設定することによって参照を解放したほうがいいです.ローカル変数は、実行環境から離れると自動的に参照が解除されます.
function createPerson(name){
    var localPerson = new Object();
    localPerson.name = name;
    return localPerson;
 }
var globalPerson = createPerson("Nicholas"); 
//   globalPerson   
globalPerson = null;