this 的兩個大原則
- Call function 時, 若沒有透過任何物件, 指向 window (in browser)
1 | function a(){ |
- Call function 時, 透過物件, 則指向當下
call它的物件
1 | function func() { |
1 | let obj = { |
透過 .call()
, .apply()
來指定 this
1 | let obj = { |
函數建構子搭配 new 建立物件
- 利用函數建構子建立物件時, 該函數內的 this 會指向
當下建立
的新物件 .
1 | function Obj(x, y) { |
API 中 Callback function 中的 this
- 在這些情況中, 大多在底層有經過特殊處理 (e.g.
利用.call()
來直接指定適當的this)
1 | $('#mybtn').addEventListener('click', function() { |
Node 環境中的 this
- 利用 cmd: node [filename] 來執行 js 檔案的情況下, 在 node 的 global 環境宣告變數時,
不會掛載
在其 global 物件上(不像 browser 會掛在 window 上), 因此在測試時需注意1
2
3
4
5
6let x = 100;
function a() {
console.log(this.x);
}
a(); // Output: undefined .
ES6 Arrow function 中的 this
- ES6中, Arrow function 是
沒有
this 的, 因此, 在 Arrow function 中使用 this, 會繼承其創建時
的function scope
所對應的 this - 沒有this, 所以
不可以
當建構子函數
1 | // Sample 1. |
常出現的陷阱
1 | var c = { |
解決方法 :
ES5
1
2
3
4
5
6
7
8
9
10
11
12var c = {
name: 'The c object',
log: function(){
var self = this; //建立一個變數 self 把這邊的 this 存起來
var log2 = function(){
console.log(self);
}
log2();
}
}
c.log(); // 顯示 Object {name: "The c object"}ES6 - arrow function