# this 到底是誰|筆記 by Sz
###### tags: `Sz` `課前` `Vue新手夏令營`
- [Vue 新手夏令營 課程頁面](https://hackmd.io/@dbFY0UD9SUeKmNXhWf01ew/BkJoW-hn_/%2FC05go-8iTSS-nrMwKU22kA)
- [:sun_with_face:筆記入口](/2JiZbCPdR0G4p5fNycPmTg)
:::info
- 主流框架都會用到
- 是 function 隱藏版參數們
- this 的特性
- 主要看的就是 function 是從哪裡呼叫的,就是指誰
- this 的幾種狀況
- simple call (不太會這樣用)
- object 的 function(最常用)
- function 跟 iphone 一樣,你的 iphone 不是他的 iphone
- 陷阱題
- object 中還有 object
- Object 裡面的 function 硬要呼叫全域 function
- callback function
:::
## function 的隱藏版參數們
這是一個 function,參數除了我們自己定義的 parameter 之外(範例中為 params)
還有其他 function 內建的參數
- this
- window
- arguments
````
var a = '全域'
function fn(params) {
console.log(params, this, window, arguments);
debugger;
}
````
他們可以在哪裡看到呢?
### debugger
會將 Devtool 的 debugger 停在這個程式碼上
#### scope 作用域
在 scope 裡可以看到這些隱藏版參數,執行剛剛的 `fn()`
````
fn(1, 2, 3); // 觀察執行 function 後
````
- `fn`
- `<this>`: Window
- `arguments`: 多了一個類陣列 (1, 2, 3)
- `Window`: Global
## this 的特性
- 指向是會變動的
- 不用太煩惱,通常只會用到一種
- 傳統的 function 的 this 只與調用方式有關,跟定義沒什麼關係(新的 function 看箭頭函式那篇)
- 主要看的就是 function 是從哪裡呼叫的,就是指誰
## this 的幾種狀況
開始把這個 function 想成一台 iphone
### 不太會這樣用:simple call
function 在全域中,function 中的 this 指向全域
這台 iphone 還在 apple 商店裡,他沒有主人
````
var someone = '全域';
function callSomeone() {
// 呼叫全域的變數:simple call
console.log(this.someone);
}
callSomeone();
````
### 最常用的:object 裡的 function
function 在 object 中,function 中的 this 指向 object
這台 iphone 還在 apple 商店裡,他沒有主人
有 object 的 iphone 就有主人了,他的主人是 obj
````
var obj = {
someone: '物件',
callSomeone() {
console.log(this.someone);
}
}
obj.callSomeone();
````
### 看 function 是誰的,this 就是指誰
不同個 object 擁有同個 function 並不衝突,就像你有 iphone,他也可以有
````
var obj2 = {
someone: '物件2',
callSomeone() // 語法糖省略 key
}
obj2.callSomeone(); // 指向 obj2
````
### 陷阱題
#### Object 中還有 Object
小孩的 iphone 不是你的 iphone
````
var wrapObj = {
someone: '外層物件',
callSomeone(), // wrapObj 的 function
innerObj: {
someone: '內層物件',
callSomeone(), // innerObj 的 function
}
}
wrapObj.innerObj.callSomeone();
````
#### Object 裡面的 function 硬要呼叫全域 function
callSomeone 還是全域的 funciton
````
var obj3 = {
someone: '物件 3',
fn() {
callSomeone(); // 通常平常不會這樣去取用 this
}
}
obj3.fn();
````
#### callback function:避免用 this
使用 callback function(像是在forEach裡),大部分就是把一個定義好的 function 簡化放到 callback funciton 裡面
所以他還是一個全域的 function
````
var obj4 = {
someone: '物件 4',
fn() {
setTimeout(function () {
console.log(this.someone); // simple call
});
}
}
obj4.fn();
````