這幾天,又花了點時間看了下ecmascript。以下是我摘錄出來的一些理解。在此記錄下。
第一部分:關於變量對象的理解
1) 什麼是變量對象?
數據的存取與讀取機制,就是變量對象。
變量對象 是執行上下文相關的對象,包括3種:
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 對象是函數執行上下文中激活對象中的一個,有三個屬性:
-
callee 對當前函數的引用
-
length 真實的參數個數
-
properties-index 函數參數值
說明:如果真實的參數個數小於定義的參數個數,那麼通過arguments方式來獲得,是不行的。
-
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. 理論上,所有的函數都是閉包
歡迎大家拍磚!!