var get = {
byId: function(id) { return document.getElementById(id) },
byClass: function(sClass, oParent) {
var aElem = this.byTagName("*", oParent); // 這裡的 this 指向誰?
},
byTagName: function(elem, obj) { return (obj || document).getElementsByTagName(elem) }
};
問題:byClass 內部調用 this.byTagName 時,this 具體指向什麼?為何不直接寫 get.byTagName?
this 永遠指向「調用該函數的對象」(調用站點決定綁定)。
// 調用鏈
get.byClass("subnav", oNav)
→ byClass 內部:this === get
→ this.byTagName("*", oParent) 等價於 get.byTagName("*", oParent)
this 而非 get?| 維度 | 直接寫 get.byTagName | 使用 this.byTagName |
|---|---|---|
| 作用域查找 | 需沿作用域鏈查找全局/外層變量 get | 直接通過 this 訪問,無作用域查找開銷 |
| 重構安全性 | 若對象重命名(如 var util = get),內部調用失效 | 自適應調用對象,重構無需修改內部代碼 |
| 繼承/擴展 | 子對象無法覆蓋內部調用 | 支持原型鏈繼承,子對象可覆蓋 byTagName |
| 性能 | 極微小差異(現代引擎優化後幾乎無差) | 理論上略快,實際可忽略 |