サイトのフロントエンドJavaScript-基礎入門.0008.JavaScript作用範囲


基本タイプの値:
説明:基本型変数は主にスタックメモリに変数名+変数値を保存します。変数の割り当て時にこの値がベースタイプと認定されると、固定サイズの空間が割り当てられます。基本タイプはUnidefined、Null、Boolean、Number、Stringのワード値のオブジェクトをベースタイプのオブジェクトと呼びます。
var name = '   '
//          "   " newName
var newName = name
newName = '   '
//                    ,                        
console.log(name, newName)
参照の種類の値:
説明:参照型変数はメモリサイズが固定されていませんが、メモリアドレスが固定されていますので、変数名+データがスタックメモリに保存されています。変数値はヒープメモリに保存されています。参照型変数を調べるときは、まずスタックからメモリアドレスを読み出して、参照タイプはObject、Aray、Date、RegExp、Funct、基本パッケージタイプ(Stering,Boolean,Number)オブジェクトと[]/{}生成された配列と対象などは、参照タイプの対象と呼ばれます。
var userInfo = {
    name: '   '
}
//          userInfo      newUserInfo,  userInfo newUserInfo       
var newUserInfo = userInfo
newUserInfo.name = '   '
//   userInfo newUserInfo       ,                                        ,                
console.log(userInfo.name, newUserInfo.name)
転送パラメータ:
説明:Jsのすべての関数のパラメータは値によって伝達されます。参照パラメータと参照参照参照の伝達は概念ではありません。関数は基本パラメータと参照パラメータを伝達することをサポートしていますが、パラメータは参照によって伝達されません。参照伝達であれば、関数内の変数はグローバル変数となり、外部からアクセスできます。
//    -     ,    
function numAdd(num){
    num++
    return num
}
var num = 10
//  num    ,num++   num    +1,   num      
console.log(num, numAdd(num), num)
//    -     ,    
function userEdit(userInfo){
    userInfo.name = '   '
    return userInfo
}
var userInfo = {name: '   '}
//   userInfo      ,userInfo.name='   '   userInfo    ,                                    
console.log(userInfo.name, userEdit(userInfo), userInfo.name)
検出タイプ:
説明:基本タイプのオブジェクトを検出するには、typeof表式があります。この表式は、対応するタイプのオブジェクトのタイプの文字列を印刷します。ただし、参照タイプのオブジェクトがtypeof検出で基本的に返されるのはすべてobjectです。参照タイプのオブジェクトの元のタイプを知りたいです。instance of表式で判断できます。
var strOrgObj = 'python'
var strRefObj = new String('python')
// strOrgObj                , strRefObj       (            ),      
console.log(typeof strOrgObj, typeof strRefObj, strRefObj instanceof String)
注意:instance ofは、参照タイプのオブジェクトタイプ検出のみに対応しています。基本タイプの値をチェックすると、falseに戻ります。
作用環境:
説明:実行環境は変数や関数がアクセスできる他のデータを定義しています。実行環境ごとにオブジェクトが関連しています。グローバル実行環境はwindowオブジェクトと考えられています。したがって、すべてのグローバル変数と関数はwindowオブジェクトの属性と方法として作成されます。局変数もwindowのような変数オブジェクトがあります。環境で定義された変数と関数はこのオブジェクトに保存されます。
//       -              window  
var userName = '   '
console.log(window.userName)
//       -                     
function sort(arr){
    //    sort     cmp  ,       
    function cmp(a, b){
        a = parseInt(a)
        b = parseInt(b)
        return a>b?1:(a==b?0:-1)
    }
    return arr.sort(cmp)
}
console.log(sort([1, 11, 2, 22, 3, 33]))
説明: 各関数は呼び出し時に自分の実行環境を作成します。この関数を実行すると、関数の環境は環境スタックにプッシュされて実行され、実行後はスタックでポップアップされ、制御権は前のステージの実行環境に渡されます。また、関数が呼び出されると自動的に上の図のような作用領域チェーンが作成されます。作用領域で変数を検索すると、作用域の先端から検索されます。逐次外部に照会するので、var初期化変数を使用しないことは強く推奨されません。この方法は様々な予期せぬ結果をもたらすかもしれません。
注意:実行環境においてすべてのコードが実行された場合、この環境は破壊され、保存されているすべての変数と関数も破壊されます。グローバル変数環境の下では、プログラムの実行が完了したり、ウェブページが閉じられたりして廃棄されます。
テクニック:try-catch文とcatchブロックとwith文には拡張機能があります。指定されたオブジェクトを自分の一番近い作用領域チェーンに追加します。次のように簡単に一つのwith構築url関数を実証します。
function buildUrl(){
    q = '?debug=true'
    with(location){
        // with url        (buildUrl)  
        var url = href + q
    }
    return url
}
console.log(buildUrl())
メモリの問題:
説明:JavaScriptは自動ごみ収集機構を持っていますが、ゴミ回収メカニズムは周期的に運行されています。一般的には最小メモリを占用することでより良い性能を得ることができます。メモリを最適化する最善の方法は、データがもう役に立たなくなると、削除をマークすることです。
var userInfo = {name: '   '}
userInfo = null
console.log(userInfo)