作用ドメインチェーンと閉包のまとめ
3298 ワード
JavaScriptのスコープ
簡単に言えば、作用域は変数と関数のアクセス可能範囲であり、作用域は変数と関数の視認性とライフサイクルを制御している.JavaScriptでは、変数のスコープは大域的なスコープと局所的なスコープの二つがあります.
関数のスコープの特性のために、局所変数は関数全体にわたって常に定義されており、変数宣言を前倒しして関数の上部に行くことができ、変数初期化は元の位置にある.
クローズドとは、別の関数のスコープにアクセスする権限を持つ変数の関数です.
簡単に言えば、作用域は変数と関数のアクセス可能範囲であり、作用域は変数と関数の視認性とライフサイクルを制御している.JavaScriptでは、変数のスコープは大域的なスコープと局所的なスコープの二つがあります.
var v = 20; // , JS
function(){
var v = 10;// ,
}
alert(v); // :20
。
// v , 。
alert(v); // :20
関数内のすべての末尾に直接割り当てを定義する変数は、グローバルスコープを持つように自動宣言されます.function sum(){
var v = 20;
b = 10;
alert(v);
}
sum(); //20
alert(b); //10
alert(v); //
JavaScriptの中にブロックレベルの作用領域がありますか?
var m = 5;
if(m == 5){
var n = 10;
}
alert(n); // 10- JavaScript JavaScript
関数が作成されると、そのスコープはこの関数のスコープ内でアクセス可能なデータオブジェクトによって作成されます.function add(num1,num2) {
var sum = num1 + num2;
return sum;
}
関数addを作成すると、そのスコープチェーンにグローバルオブジェクトが入力されます.このグローバルオブジェクトには、すべてのグローバル変数が含まれています.関数のスコープの特性のために、局所変数は関数全体にわたって常に定義されており、変数宣言を前倒しして関数の上部に行くことができ、変数初期化は元の位置にある.
var scope="global";
function t(){
console.log(scope); // "undefined", "global"
var scope="local"
console.log(scope); // "local"
}
t();
sを実行すると、関数sの実行環境(呼び出し対象)を作成し、そのオブジェクトをチェーンの先頭に置いて関数tの呼び出しオブジェクトをリンクした後、最後にグローバルオブジェクトになります.チェーンの先頭から変数nameを探します.明らかにnameは「swy」ですが、ss()を実行すると、nameはtlwyです.name="lwy";
function t(){
var name="tlwy";
function s(){
var name="slwy";
console.log(name);
}
function ss(){
console.log(name);
}
s();
ss();
}
t();
包みを閉じるクローズドとは、別の関数のスコープにアクセスする権限を持つ変数の関数です.
function createSumFunction(num1, num2){
return function () {
return num1 + num2;
};
}
var sumFun = createSumFunction(3, 4);
var sum = sumFun();
alert(sum);
クローズドで使用する局所変数の値は、必ず局所変数の最後の値です.function a(){
var n = 0;
function inc() {
n++;
console.log(n);
}
inc();
inc();
}
a(); // 1, 2
よくある落とし穴、0~9を出力すると思っていますが、まさか10個を出力します.function createFunctions(){
var result = new Array();
for (var i=0; i < 10; i++){
result[i] = function(){
return i;
};
}
return result;
}
var funcs = createFunctions();
for (var i=0; i < funcs.length; i++){
console.log(funcs[i]());
}
上の説明は:var result = new Array(), i;
result[0] = function(){ return i; }; // , , i !
result[1] = function(){ return i; }; // , , i !
...
result[9] = function(){ return i; }; // , , i !
i = 10;
funcs = result;
result = null;
console.log(i); // funcs[0]() return i , 10
console.log(i); // funcs[1]() return i , 10
...
console.log(i); // funcs[9]() return i , 10
クローズドとは、別の関数の変数を参照することです.変数が参照されているので回収されないため、プライベート変数をカプセル化することができます.これは利点でもあります.必要でないクローズドはメモリ消費量を増やすだけです.また、クローズドも変数の値があなたの要求に合致するかどうかに注意します.彼は静的なプライベート変数のようです.