在建構函式中,this.add = function() {...} 將方法綁定到實例;var add = function() {...} 只是區域變數,無法透過 this.add 呼叫。
function Test() {
this.add = function() { alert(1); };
var self = this; // 保存 this 參考
this.modAdd = function() {
self.add(); // 正確:用 closure 捕獲的 self
// this.add(); // 錯誤:此處 this 指向全域/undefined
};
}
new Test().modAdd();
| 寫法 | 儲存位置 | 呼叫方式 | this 指向 |
|---|---|---|---|
| this.fn = function() {} | 實例屬性 | obj.fn() | 指向實例 |
| var fn = function() {} | 區域變數 (closure) | fn() | 指向全域/undefined (strict) |
| Test.prototype.fn = function() {} | 原型鏈 | obj.fn() | 指向實例 |
prototype 上,節省記憶體。arrow function 或 .bind(this) 固定 this。var 定義需對外暴露的方法。