再讀ecmascript

這幾天,又花了點時間看了下ecmascript。以下是我摘錄出來的一些理解。在此記錄下。

第一部分:關於變量對象的理解

1) 什麼是變量對象?
 
數據的存取與讀取機制,就是變量對象。
 
     變量對象 是執行上下文相關的對象,包括3種:
  • 變量 (var )
  • 函數定義(FD)
  • 函數形參
2) 關於函數的arguments
 
function foo(x,y,z){
    z=40;
    y=50;
    alert(arguments.callee===foo); 
    alert(arguments.length); //1
    alert(arguments[1]); //undefine
    alert(arguments[2]); //undefine
}

foo(10)
 
arguments 對象是函數執行上下文中激活對象中的一個,有三個屬性:
 
  1. callee 對當前函數的引用
  2. length 真實的參數個數
  3. properties-index  函數參數值
說明:如果真實的參數個數小於定義的參數個數,那麼通過arguments方式來獲得,是不行的。
 
 
 
3. var a =1 和 a=1  的區別
 
  • var a 是變量對象 不能通過delete 刪除
  • a 是屬性 能通過delete 刪除
  變量和屬性一個最大的區別是 :變量有一個屬性【DontDelete】表示不能刪除
注意:有一個執行上下文對該規則無效,那就是  eval('var a =1')
 
4 看看例子
 
alert(a);
 
alert(b);
 
window.a=1;
 
a = 1;
 
this.a=1;
 
var b =2;
 ==============================================
第二部分:關於this的理解
 
1) this 在進入上下文的時候確定,在代碼執行期間一成不變

2) 什麼影響了this 值的變化:
this是有激活上下文代碼和調用者來提供的,即調用函數的父上下文。
調用函數的方式決定了this的值

3) 什麼是引用類型?
包括2個屬性:
1.  base  擁有屬性的對象
2.  base中property name  對象的屬性名 
引用類型的值由2中情況:
1.處理一個標示符的時候
2.屬性訪問器的時候

4)作爲構造器的函數的this
this被設置爲新創建的對象

5)一個通用規則
this 是由調用者提供,由調用函數的方式而定
有2中情況:
1.如果()左邊的是引用類型的值,那麼this將被設置爲引用類型的base對象。
2.其他情況下,全部爲null,但是這個null自動轉化爲window 對象

6) this 是一個動態特性,在函數執行的時候確定
================================================     

第三部分:作用域鏈的理解

1.對於函數而言,變量對象就是激活對象,對於全局上下文而言,變量對象就是全局變量本身。

2.作用域鏈其實就是所有內部上下文變量對象的列表。
 
3.函數的作用域鏈是在函數調用的時候創建出來的,包含了活躍對象和和該函數的內部scope屬性。
 
4.函數內部[[Scope]]機制:
 
     scope 是一個包含了所有上層對象的分層鏈,他屬於當前函數的上下文,在函數創建的時候
保存在函數中的。
   
 scope 是在函數創建的時候保存的,是一個靜態特性。
 
5.函數的生命週期
 
   分爲創建階段和激活(調用)2個階段
 
6. 函數上下文爲scope = AO+[[scope]] AO爲激活對象
 
7.什麼是閉包? 
     閉包就是函數代碼與[[scope]]屬性的組合,[[scope]]包含了創建函數創建
所有在上下文環境,上層上下文中的變量,可以在函數激活的時候,通過變量的詞法作用域鏈
查詢到。
 
8.通過 Function 創建的函數,其[[scope]] 屬性永遠只包含全局對象
 
9.如果在作用域鏈中沒有查到,那麼會查詢到原型鏈中
 
==========================================================
第四部分:閉包的理解
 
1. ecmascript 是靜態(詞法)作用域的語言
 
2. 閉包 是函數代碼塊與代碼塊的上下文數據的組合
 
3. 在ecmascript中,同一個上下文創建的閉包通用同一個[[scope]] 屬性的
 
4. 理論上,所有的函數都是閉包
 
歡迎大家拍磚!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章