javascript高級プログラム設計(4-5)章ノート


以前はjs高距離を見たことがありますが、基礎がまだしっかりしていません.独身犬は週末にまた行くところがありません.
4.変数のスコープとメモリの問題
ECMAScriptのすべての関数のパラメータは値によって伝達されます.
引用の種類は引用によって伝達されます.関数のパラメータは全部値によって伝達されます.
//        
function add(num) {
    num += 10;
    return num;
}
var count =20 ;
console.log(add(count));//30

//    
/*      :       ,obj person         。 *    ,            ,obj             */
function setName (obj) {
    obj.name = 'kenny';
}
var person = new Object();
setName(person); // 'kenny'

//        obj  
function setName (obj) {
    obj.name = 'kenny';
    obj = new Object();
    obj.name = 'gaga';
}
var person = new Object();
setName(person); // 'kenny'
高距離:関数内部でObjを書き換えると、この変数は一部のオブジェクトを参照しますが、一部のオブジェクトは関数の実行が終わったらすぐに破棄されます.個人的な理解は、関数のスコープであり、外部環境は内部のプライベート変数にアクセスできません.アーグメンツを含めて、実際にはパラメータがオブジェクトとして再定義されていますが、外部のオブジェクトは変化していないので、値によって伝達されます.即ち、オブジェクトの深さコピーです.
実行環境とスコープ
1.各実行環境には関連する変数オブジェクトがあり、環境で定義されているすべての変数と関数はこのオブジェクトに保存されています.このオブジェクトにはアクセスできませんが、js解析器はバックグラウンドで使用されます.
2.各関数には自分の実行環境があり、実行フローが関数に入ると、関数の環境が環境スタックに押し込まれます.コードが環境で実行されると、変数オブジェクトのスコープチェーンが作成されます.各環境は、変数と関数名を調べるために、ロールフィールドチェーンを上に検索することができます.(アクセスローカル変数はグローバル変数よりも速く、Javascriptエンジンは、最適化された識別子の検索村ではOKです.無視できます.)
ごみの収集
タグクリア(大部分のブラウザはこれによって実装されます)と参照カウント
メモリの管理
データが参照されなくなると、nullに設定することで参照を解放することが望ましい.ほとんどのグローバル変数とグローバルオブジェクトの属性に適用します.ローカル変数は彼らが実行環境から離れると自動的に参照を解除します.
//    ,person           ,
function person (name) {
    var localPerson = new Object();
    localPerson.name = name;
    return localPerson;
}
var gloablPerson = person('kenny');
gloablPerson = null;
解除値の参照はすぐに自動的にこの値が使われているメモリを回収しません.値を実行環境から逸脱させて、ゴミ収集器は次の運転で回収します.
結び目
  • 基本タイプの値は固定サイズの空間を占めるので、スタックに保存され、参照タイプの値は対象となり、ヒープメモリに保存される.
  • は、1つの変数から他の変数に参照タイプの値をコピーし、コピーしたものはポインタであるため、2つの変数は同じオブジェクトを指す.
  • は、新しい実行環境に入るたびに、変数と関数を検索するための作用ドメインチェーン
  • を作成する.
    5.参照の種類
    オブジェクトの字面量がオブジェクトの字面量で定義されている場合、実際にはObjectコンストラクタ(Firefox 2およびより前のバージョン)は呼び出しられません.【ES 3の前の正則字面量はバグがあり、循環testの文字列は、一回は本当かどうか、ES 5は修正されました(P 105ページ)】
    安全のタイプ検出
    var isArray = value instanceof Array;
    以上のコードがtrueに戻るには、valueは配列でなければなりません.また、Arayコンストラクタと同じ大域作用領域にある必要があります.(印を押すと、Arayはwindowの属性です.)valueが別のframeで定義されている配列であれば、上記のコードはfalseに戻ります.
    任意の値でObjectの原音のtoStringを呼び出す方法では、「Object NativeContstruct Name」形式の文字列が返されます.元の配列の構造関数は大域的な作用領域と関係がないので、toString()は同じ値を返すことが保証されます.
    function isArray(value) {
        return Object.prototype.toString.call(value) === '[object Array]';
    }
    function isFunction(value) {
        return Object.prototype.toString.call(value) === '[object Function]';
    }
    function isRegExp(value) {
        return Object.prototype.toString.call(value) === '[object RegExp]';
    }
    ウェブ開発において、原生と非原生javascriptオブジェクトを区別することは非常に重要であり、このようにして、あるオブジェクトがどのような機能を持っているかを確実に知ることができますが、Object.prototype.toString()自体も書き換えられます.
    Functionタイプ
    各関数は、Functionタイプの例であり、他の参照タイプと同様に属性と方法を有する.関数はオブジェクトであるため、関数名は実際に関数オブジェクトを指すポインタでもあり、関数と結合されません.
    //     ,      
    function sum(num1, num2) {
        return num1 + num2;
    }
    console.log(sum(10,10)); //20
    var anotherSum = sum; //                  ,      
    console.log(anotherSum(10,10)); //20
    sum = null; //        
    console.log(anotherSum(10, 10))//20
    そして関数を実行しないで関数のポインタにアクセスするには、関数名の後ろの丸括弧を削除しなければなりません.
  • 関数宣言と関数式
  • js解析器は、まず関数宣言を読み取り、任意のコードを実行する前に使用できるようにします.関数式については、解像器がその所在するコード行に実行するまでは、本当に解析されます.
  • は値の関数として
  • です.
            function createComparisonFunction(propertyName) {
    
                return function(object1, object2){
                    var value1 = object1[propertyName];
                    var value2 = object2[propertyName];
    
                    if (value1 < value2){
                        return -1;
                    } else if (value1 > value2){
                        return 1;
                    } else {
                        return 0;
                    }
                };
            }
    
            var data = [{name: "Zachary", age: 28}, {name: "Nicholas", age: 29}];
    
            data.sort(createComparisonFunction("name"));
            alert(data[0].name);  //Nicholas
    
            data.sort(createComparisonFunction("age"));
            alert(data[0].name);  //Zachary 
  • 関数内部属性
  • 関数の内部には2つの特殊なオブジェクトがあります.アーグメンントとthis、アーグメンント.
    thisは、関数を参照して実行する環境オブジェクト、すなわち関数を呼び出して、蝶の本には4つの呼び出しモードがあると述べています.方法の呼び出しモードは、thisは現在の方法のオブジェクトを指します.2.関数呼び出しモード、thisはグローバルオブジェクト、クライアントすなわちwindowに結び付けられます.3.コンストラクタ呼び出しモードで、thisは実用化された新しいオブジェクトに結合されます.4.apply/callコールモードでは、最初のパラメータはthisにバインドされ、2番目のパラメータapplyは配列、call([thisObj,arg 1[,arg 2]]]]))である.
  • 関数属性と方法
  • 各関数には二つの属性が含まれています.length(関数が受信したい名前付きパラメータの個数)とprototype.
    ECMAScriptにおける引用のタイプにとって、prototypeは彼女たちのすべての例示的な方法を保存する真の場所である.ES 5ではプロトタイプの属性は列挙できません.(原生ではないプロトタイプの属性は列挙できます.つまり人為的に追加されたものです.googleでテストしたことがあります.)for-innを使っているので、見つけられません.
    ES 5はまた、方法を定義している.この方法は、ビッド関数に伝える値に結合される関数の例を作成します.
    基本包装の種類
    var s1 = 'some text';
    var s2 = s1.substring(2);
    上記は三つのステップ1に解析され、Stringタイプを作成する例と;2.インスタンス上で指定された方法を呼び出す.3.このインスタンスを破壊する実行コードは以下のようになります.
    var s1 = new String('some text');
    var s2 = s1.substring(2);
    s1 = null;
    引用タイプと基本包装タイプの主な違いは対象の生存期間です.newオペレータによって作成された参照タイプの例は、現在のスコープからストリームが離れる前にメモリに保存されています.自動で作成された基本パッケージの種類は、行コードの実行瞬間だけに存在し、廃棄されることを理解する.
    結び目
    すべてのコードが実行される前に、作用領域には既に二つの内蔵オブジェクトが存在します.GlobalとMath.ほとんどのECMAScriptの視線の中で直接Globalオブジェクトにアクセスできません.しかし、WEBブラウザでは、キャラクターを担うwindowのオブジェクトが実現しました.グローバル変数と関数は、Globalオブジェクトの属性です.Mathオブジェクトは複雑な数学計算の完了を支援する多くの属性と方法を提供する.