JavaScript基礎(chǔ)之this和箭頭函數(shù)詳析
箭頭函數(shù)不會創(chuàng)建自己的this,它只會從自己的作用域鏈的上一層繼承this。
由于箭頭函數(shù)沒有自己的this指針,通過 call() 或 apply() 方法調(diào)用一個函數(shù)時,只能傳遞參數(shù)(不能綁定this),他們的第一個參數(shù)會被忽略。
前言
閱讀下面的內(nèi)容要先看下《你不知道的javascript(上)》中的第二部分:this和對象原型(里面對于this指向的理論部分主要來源于該書)。
問題
這周在寫代碼的時候,聽同事在說箭頭函數(shù)無法更改this的指向,并且使用下面代碼進行驗證:
// (1) 使用箭頭函數(shù),this一直指向window var a = 0 var obj1 = { a: 1, fn: () => { console.log(this.a) } } obj1.fn() // 結(jié)果:0 var obj2 = { a: 2 } obj2.fn = obj1.fn obj2.fn() // 結(jié)果:0
// (2)不使用箭頭函數(shù),this的指向會更改 var obj3 = { a: 3, fn: function() { console.log(this.a) } } obj3.fn() // 結(jié)果:3
第一段代碼,無論fn綁定在哪個對象上,this.a始終指向全局的a(在非嚴格模式下的瀏覽器中我們可認為是window)
然而,這種說法是有問題(我認為)。
先理解this
this代表什么取決于:
- 調(diào)用位置
- 四種綁定規(guī)則
var a = 0 test() // 調(diào)用位置在此,通過【默認綁定規(guī)則】,可知test的this綁定到了window上 function test() { console.log(this) // this是window var obj1 = { a: 1, fn: function() { console.log(this) // this是obj1 console.log(this.a) } } obj1.fn() // 調(diào)用位置在此,通過【隱式綁定規(guī)則】,可知fn中的this綁定到了obj1上 var obj2 = { a: 2 } obj2.fn = obj1.fn obj2.fn() // 調(diào)用位置在此,【隱式綁定規(guī)則】,可知fn內(nèi)的this綁定到了obj2 }
箭頭函數(shù)中的this
其實這么起標題不太準確(然而想不出好的名字),因為箭頭函數(shù)是不會創(chuàng)建自己的this的(MDN),那么下面代碼的this是來源于哪里的呢?
var obj3 = { a: 3, fn: () => { console.log(this.a) } } obj3.fn() // 調(diào)用位置在此,this指向window
arrowFoo1() // (1)此處是調(diào)用位置,使用【默認的綁定規(guī)則】,this = window function arrowFoo1() { var obj1 = { vv: 'svv1', fn: () => { console.log(this.vv, 'vv的值是') } } // (2)調(diào)用位置是此處,若fn不是箭頭函數(shù),那么這里也會有自己的this(即【隱式調(diào)用規(guī)則】,this綁定為obj1),而fn是箭頭函數(shù),則它沒有this,那么fn內(nèi)部調(diào)用的this是誰? // 這時候需要根據(jù)作用域的規(guī)則,往外層查找,找到哪里?找到調(diào)用obj1.fn的調(diào)用棧,即arrowFoo1函數(shù)的this,那么從(1)中可知,那個this指向的是window obj1.fn() var obj2 = { vv: 'svv2', } obj2.fn = obj1.fn obj2.fn() } function arrowFoo2() { var vv = '哦哦哦哦哦' console.log(this.vv, 'vv的值是') }
因此,箭頭函數(shù)里面要是用到了this,那么其實它是通過作用域鏈,往外進行查找的,找到了就直接返回咯。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關(guān)文章
JavaScript簡單實現(xiàn)的仿微博留言功能示例
這篇文章主要介紹了JavaScript簡單實現(xiàn)的仿微博留言功能,涉及javascript頁面元素屬性動態(tài)操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2019-01-01JS通過識別id、value值對checkbox設(shè)置選中狀態(tài)
最開始需要獲取的是input value值設(shè)置checkbox選中狀態(tài),由于input value要使用計算業(yè)務(wù),后來改造為id,這里就為大家分享一下實現(xiàn)代碼,需要的朋友可以參考下2020-02-02微信小程序van-field中的left-icon屬性自定義實現(xiàn)過程
在小程序中,我們是用 Vant 組件庫時,常常會用到 van-field 輸入框控件,今天我將跟大家分享的是 van-field 輸入框控件中的 left-icon 屬性的自定義怎么實現(xiàn),感興趣的朋友一起看看吧2023-08-08javascript文本框內(nèi)輸入文字倒計數(shù)的方法
這篇文章主要介紹了javascript文本框內(nèi)輸入文字倒計數(shù)的方法,涉及javascript針對鍵盤事件的操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-02-02