--- tags: JavaScirpt, hexo部落格 title: 箭頭函式與 this(下) - call、apply、bind --- ## 函式的內建方法與關鍵字 在箭頭函式與 this(上)中提到,箭頭函式沒有這些方式可以用 : - `this` - `arguments` - `call()` - `apply()` - `bind()` 這篇我們要來看這些東西原本是怎麼運作的。 ### 關鍵字 this 複習一下 `this` 的運作 : ```javascript var person = { name: 'Vic', age: 18, whoAmI: function(){ console.log(`我是${this.name},今年${this.age}歲`) } } person.whoAmI() // 由於是在物件呼叫此函式的,所以往上一層尋找時(非箭頭函式),會找到此物件的屬性值 ``` ### 關鍵字 arguments - 一般函式內建的關鍵字之一 - 可以將傳入的參數值抓取出來形成一個類陣列**物件** ```javascript function sum(a, b) { console.log(arguments[0]) console.log(typeof(arguments)) } sum(2, 4) // 2 // "object" ``` ### 內建函式 call、apply、bind的共通點 - JS的內建函式 - 它們都與 `this` 有所關聯 - 不需要在函式中自訂參數就能將變數塞進 `this` - 若有多個值,函式的第一個參數位置為 `this` - 也就是說`(this, 參數1, 參數2, 以此類推)` 接下來,我們來看,`call()`、`apply()`以及 `bind()` 如何與 `this` 運作。 ### 內建函式 call - 單純將參數值傳入 ```javascript function sum(a) { console.log(`this為${this}`) console.log(`第二個是${a}`) console.log(this + a) } sum.call(2, 4) // "this為2" // "第二個是4" // 6 ``` ### 內建函式 apply - 傳入的型態必須是陣列 - 功能上與 `call` 無異 ```javascript function sum(a, b) { console.log(`陣列中第一個是${a}`) console.log(`this為${this}`) console.log(`陣列中第二個是${b}`) console.log(this + a + b) } let array = [2, 4] sum.apply(1, array) // "陣列中第一個是2" // "this為1" // "陣列中第二個是4" // 7 ``` ### 內建函式 bind - **`bind()`將建立一個新的函式** ```javascript // 範例一 // bind會建立一個新的函式 // this會對應傳入的參數 newPerson var name = 'Jay' function display(){ console.log(this.name) } var newPerson = { name: 'Vic' } var newDisplay = display.bind(newPerson) display() // Jay newDisplay() // Vic // 新的函式會執行 console.log(newPerson.name) ``` ```javascript // 範例二 // 若有多個值,bind的參數第一順位為 'this' function sum(a) { console.log(`第一個是${this}`) console.log(`第二個是${a}`) console.log(this + a) } let plusTwo = sum.bind(2, 4) plusTwo() // "第一個是2" // "第二個是4" // 6 ``` ## 箭頭函式與 this 我們了解到箭頭函式沒有自己的 `this`,相對的也就沒有上述的那三種內建函式可供使用,也無法使用 `arguments`,但可以改用其餘參數來達成目的。箭頭函式與一般函式的運用,還是得看實際情況來做使用。 ## 參考來源 > 1. [realdennis - [JavaScript] 函數原型最實用的 3 個方法 — call、apply、bind](https://medium.com/@realdennis/javascript-%E8%81%8A%E8%81%8Acall-apply-bind%E7%9A%84%E5%B7%AE%E7%95%B0%E8%88%87%E7%9B%B8%E4%BC%BC%E4%B9%8B%E8%99%95-2f82a4b4dd66) > 2. [Schaos - 一次搞懂前端面試最愛問的 apply、bind、call](https://medium.com/schaoss-blog/%E4%B8%80%E6%AC%A1%E6%90%9E%E6%87%82%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%A9%A6%E6%9C%80%E6%84%9B%E5%95%8F%E7%9A%84-apply-bind-call-708f57518776) > 3. [Henry Chang - JavaScript - call,apply,bind](https://ithelp.ithome.com.tw/articles/10195896) {%hackmd S1DMFioCO %}