作用域鏈,立即執行函數

運行期上下文
當函數執行時,會創建一個稱爲“執行期上下文”的內部對象。一個執行期上下文定義了一個函數執行時的環境,函數每次執行時對應的執行上下文都是獨一無二的,所以多次調用一個函數會創建多個執行上下文,當函數執行完畢,函數的執行上下文會被銷燬。

作用域
[[scope]]:每個javascript函數都是一個對象,對象中有些屬性我們可以訪問,但有些不可以,這些屬性僅供javascript引擎存取,[[scope]]就是其中一個;
[[scope]]指的就是我們所說的作用域,其中存取了執行期上下文的集合。

作用域鏈
[[scope]]所存儲的執行期上下文對象的集合,這個集合成鏈式鏈接,也就是所謂的作用域鏈。

立即執行函數:
**定義:**此類函數沒有聲明,在一次執行過後即釋放銷燬。適合做初始化工作。
凡是隻執行一次的函數都叫做針對初始化功能的函數,函數名可有可無。

 //函數形式有兩種,但建議第一種,執行完一次就會被銷燬
(function(){
}());

(function(){
})() 

//立即執行函數可以有參數
(function aa(a,b){
	cosole.log(a + b);
}(1,2))  //輸出3,但是再次訪問aa(),會報錯undefinde.

//也可以有返回值
var num = (function aa(a,b){
	 var c = a + b;
	 return c; 
}(1,2));   //返回的值會變量num裏面,num == 3

2、只有表達式才能被執行符號執行,例:

function test(){
	console.log("123");
}();   //此種寫法會報語法錯誤,因爲()前的語句是叫函數聲明,不是叫表達式

test();  //輸出123,在這裏會正常執行,單獨的函數引用後面加括號表示執行

var test = function(){
	console.log("123");
}()   //輸出123,因爲括號前的語句是函數表達式,所以會執行。

3、有一個例外就是:

 function test(a, b, c){
	console.log(a + b + c);
}(1, 2, 3)   //在後面括號裏面寫參數,是可以執行的,不會報語法錯誤,但是沒有返回值,只是單純的執行而已

4、能被執行符號所執行的表達式,會自動放棄函數的引用,也就是相當於成了立即執行函數,執行完後再訪問函數引用,會顯示undefined

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章