一,作用域
變數在宣告它的函式及該函式所巢狀的任意函式是有定義的
例
var num=2;
function fun()
fun();
二, 作用域鏈
多個函式巢狀在一起,多個作用域相互巢狀,這是作用域鏈
var num=1;
function fun()
function fun2()
}fun1();
fun2();
fun();
訪問原則
首先會在當前函式作用域中查詢,沒有會沿作用域鏈向上查詢。直到全域性作用域。
三,閉包
什麼是閉包:能夠訪問其他函式內部的變數的函式;
為什麼要有閉包:為了在函式外部讀取區域性變數。
閉包基於原理:作用域鏈,父函式變數對子函式可見的;
閉包作用:1訪問其他函式內部變數
2:保護變數不被記憶體**機制**;
例
for(var i=0;i<5;i++),100);
}輸出結果為5,5,5,5,5
因為js是單執行緒,settimout註冊函式需要等待執行緒空間才能執行,此時for迴圈已經結束,i為5;
若想輸出0,1,2,3,4
則,將settimeout放在函式立即呼叫表示式中,將值作為引數傳遞給包裹函式,建立閉包
例
for(var i=0;i<5;i++),100);
}(i));
}
例二
function add()
add();//2
add();//2
若想實現每次執行加1;
function add()
}var num=add()
num();//2
num();//3
作用域 作用域鏈 閉包
閉包概念中的一些專業名詞概念不清晰 作用域鏈 本質是乙個指向變數物件的指標列表。函式的作用域鏈在函式呼叫完成後即被銷毀。變數物件 全域性變數物件 js執行時一直存在 活動變數物件 區域性變數物件,函式執行完畢後銷毀 函式在呼叫時建立本地的活動物件加上函式定義時預建立的作用域鏈,形成乙個新的用於執行函...
作用域鏈 閉包
什麼是閉包?js語言的特點之一是 內部函式可以訪問全域性變數的值,而外部函式不能訪問內部變數的值。function test b test 輸出123反過來,如果a變數在函式b內部的話,test函式是訪問不到的。內層函式實際上可以訪問外部的所有變數的值,在函式內部取值的時候,優先從自己的函式塊中查詢...
簡述JS作用域 作用域鏈和閉包
定義 乙個變數的作用域是程式源 中定義這個變數的區域。全域性變數擁有全域性作用域,區域性變數只有區域性作用域。塊級作用域 在es6 let變數宣告出來之前,js是沒有塊級作用域的概念的,函式內部定義的變數才是區域性變數,具體見下面的 var a 1 for var i 0 i 10 i functi...