初談this
this的指向相當複雜,大部分情境只需要了解其中一種即可(95%)
1 2 3 4 5 6 7
| var A = 'Hello world';
function callName() { console.log(this.A); }
callName();
|
1 2 3 4 5
| var A = { Name : Shawn, callName: callName } A.callName();
|
this本身與函式無關與呼叫的方式有關
(simple call)簡易呼叫:

1 2 3 4 5 6
| var someone = '全域'; function callSomeone() { console.log(this.someone); }
callSome();
|
1 2 3 4 5 6 7
| var obj = { someone: '物件', callSomeone(){ console.log(this.someone); } } obj.callSomeone();
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| var someone = '全域'; function callSomeone() { console.log(this.someone); }
var wrapObj = { someone: '外層物件', callSomeone, innerObj: { someone: '內層物件', callSomeone, } }
wrapObj.callSomeone(); wrapObj.innerObj.callSomeone()
|
this與他的定義是沒有關係的,與調用方式有關的範例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| var someone = '全域'; function callSomeone() { console.log(this.someone); }
var obj3 = { someone: '物件3', fn() { callSomeone(); } } obj3.fn();
|
當此範例中的callSomeone前面沒有指向任何位置,那麼它屬於全域範圍
遇上callback function
當是callback function時,this 指向全域:
1 2 3 4 5 6 7 8 9 10 11 12
| var name = '全域' const person = { name: '小明', callName: function (){ console.log('1', this.name); setTimeout(function () { console.log('2', this.name); console.log('3', this); },10); }, } person.callName();
|
箭頭函式沒有自己的this
內部作用域依外層this指向為主:

或者
1 2 3 4 5 6 7 8 9 10 11
| var name = '全域' const person = { name: '小明', callMe() { const callName = () => { console.log(this.name); }; callName(); } } person.callMe();
|
此處this指向外層callMe function,而function呼叫指向person物件,因此印出小明

嚴謹模式
如果在嚴謹模式下,透過簡單呼叫,函數裡 this 會是 undefined,無法執行 this.name,會發生錯誤。
https://book-js-something.onejar99.com/articles/day18.html