第7章 函數表達式
- 匿名函數的name屬性是空字符串;
- 閉包是函數:閉包是有權訪問另一個函數作用域中變量的函數;(P181 副作用,解釋了點擊li彈出循環最后值的原因)
- 當某個函數第一次被調用時,會創建一個執行環境及相應作用域鏈,并把作用域鏈賦值給一個特殊內部屬性[[scope]],使用this、arguments和命名參數來初始化函數的活動對象;
- 無論什么時候在函數中訪問一個變量時,就會從作用域鏈中搜索具有相應名字的變量。一般來講,當函數執行完畢后,局部活動對象就會被銷毀,內存中僅保存全局作用域(全局執行環境的變量對象);
- 閉包不然:在函數內部定義的函數,會將外部函數的活動對象,添加到自己的作用域鏈中;
- 閉包的副作用:閉包只能取得外部函數中任何變量的最后一個值;
function createFunctions() {var result = new Array()for(var i = 0;i < 10; i++){return[i] = function() {return i}}return result
}
// 每個函數的作用域鏈中都保存著createFunctions()函數的活動對象,它們引用同一個變量i
- 創建一個匿名函數,強制讓閉包的行為符合預期:
function createFunctions() {var result = new Array()for(var i = 0;i < 10; i++){return[i] = function(num) {return function() {return num}}(i)}return result
}
//沒有直接將閉包賦值給數組;
//定義了一個匿名函數,并將立即執行該函數的結果賦值給數組;
//匿名函數有參數num,也是最終函數要返回的值;
//在調用每個匿名函數時,傳入變量i,函數參數是按值傳遞的,會將變量i的當前值傳給num
//匿名函數的內部,又創建并返回了一個訪問num的閉包
- 匿名函數的執行環境具有全局性,其this對象通常指向window:
var name = "The Window"
var obj = {name: "My Obj",getNameFunc: function(){return function(){return this.name}}
}
obj.getNameFunc()() // The Window
- JavaScript不會告訴你是否多次聲明了同一個變量,遇到這種情況,它會對后續的聲明視而不見;
- 用匿名函數來模仿塊級作用域:
(function(){// 這里是塊級作用域
})()
錯誤寫法:
function(){// 這里是塊級作用域
}()
錯誤: 函數聲明后面不能跟圓括號
第8章 BOM
- window對象
- location對象
- navigator對象
- screen對象
- history對象
- 嘗試訪問未聲明的變量會拋出錯誤,但是通過查詢window對象,可以知道某個可能未聲明的變量是否存在:
var b = a //報錯,這里a未定義
var c = window.a // c的值是undefined
第9章 客戶端檢測
- 能力檢測:
1) 先檢測達成目的的最常用的特性(避免測試多個條件)
2) 必須測試實際要用到的特性
第10~12章 DOM
- NodeList是有生命、呼吸的對象,而不是在我們第一次訪問它們的某個瞬間拍攝下來的一張快照;
- 如果列表中只有一個節點,那么該節點的nextSibling和previousSibling都為null;
- ownerDocument是所有節點都有的屬性,指向整個文檔的文檔節點;
第13章 事件
- 建議使用事件冒泡;
- 事件處理程序中的代碼在執行時,有權訪問全局作用域中的任何代碼;
- 在HTML中指定事件處理程序的缺點:
1)存在時差問題:用戶可能在頁面剛顯示按鈕時,就點擊,如果點擊事件是在按鈕下方、頁面的最底部定義的,就會引發錯誤,可以封裝在try-catch塊中;
2)事件處理程序的作用域鏈在不同瀏覽器中可能會有不同效果;
3)HTML和JavaScript緊密耦合; - 事件對象:
1) DOM中:event對象作為參數;
2) IE中:event對象作為window對象的屬性