[JS] 淺談this
TL;DR
這個就是this啊~
參考資料
- 學好 this 前,先搞清楚 this 做什麼(卡斯柏) | Casper
- 箭頭函式常見陷阱題(卡斯柏) | Casper
- 關於 JavaScript 的 this 各種用法與探討 | Ray
相關連結
function基本介紹
傳入function的參數
開始前,先介紹function
var name = '全域'
function fn(params) {
console.log(params, this, window, arguments);
// debugger;
}
fn(1,2,3);
執行結果如下:
可以看到我們雖然傳入了三個參數,但是實際上
fn
接收到的只有第一個的1
。
而arguments
內則會是我們完整傳入的參數。
後面三個(
this
,window
,arguments
)參數是函式預設就會傳入的,不需要我們手動傳入。
傳統函式的this
obj.fn內的this
創建一個物件,並且將上述的function放在物件內
var name = '全域'
var obj = {
name: '小明',
fn: function(params) {
console.log(params, this, window, arguments);
// debugger;
}
}
obj.fn(1,2,3);
執行結果如下:
可以注意到這邊的this指向變得不一樣了,變成是obj物件本身。
simple call內 的this
我們再來看一個範例:
var someone = '全域';
function callSomeone() {
var someone="function內";
console.log(this.someone);
}
callSomeone();
執行結果:
這種直接執行的方式稱為simple call
如果使用
let
,const
結果會有所不同需要注意,上面的範例是使用var
宣告。
如果今天是用ES6的let
or const
去宣告,結果會不一樣
let someone = '全域';
function callSomeone() {
var someone="function內";
console.log(this.someone);
}
callSomeone();
執行結果:
使用
let
或是const
宣告全域都會輸出undefined
,這是因為使用var宣告會變成全域的一個屬性,可以使用點記法去取值。
this到底指向哪?
延伸上一個範例,如果今天不使用simple call,而是另外定義一個物件:
var someone = '全域';
function callSomeone() {
const someone="function內";
console.log(this.someone);
}
var obj = {
someone: '物件',
callSomeone() {
console.log(this.someone);
}
}
obj.callSomeone();
obj.callSomeone
使用物件內的函式縮寫形式
執行結果如下:
執行後會印出物件的字串
傳統韓式的this只與調用方法有關。
證明方法如下,我們今天撰寫程式碼:
var someone = '全域';
function callSomeone() {
const someone="function內";
console.log(this.someone);
}
var obj2 = {
someone: '物件2',
callSomeone
}
obj2.callSomeone();
上述程式碼我們在 Line:3 宣告了一個具名函式,並且在 Line:10 的地方使用縮寫的方式帶入。
接著我們使用obj2.callSomeone()
去調用它。執行結果如下: