国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

深入理解Javascript箭頭函數中的this

2019-11-19 17:37:35
字體:
來源:轉載
供稿:網友

首先我們先看一段代碼,這是一個實現倒數功能的類「Countdown」及其實例化的過程:

function Countdown(seconds) { this._seconds = seconds;}Countdown.prototype._step = function() { console.log(this._seconds); if (this._seconds > 0) {  this._seconds -= 1; } else {  clearInterval(this._timer); }};Countdown.prototype.start = function() { this._step(); this._timer = setInterval(function() {  this._step(); }, 1000);};new Countdown(10).start();

運行這段代碼時,將會出現異常「this._step is not a function」。

這是Javascript中頗受詬病的「this錯亂」問題:setInterval重復執行的函數中的this已經跟外部的this不一致了。

要解決這個問題,有三個方法。

閉包

新增一個變量指向期望的this,然后將該變量放到閉包中:

Countdown.prototype.start = function() { var self = this; this._step(); this._timer = setInterval(function() {  self._step(); }, 1000);};

bind函數

ES5給函數類型新增的「bind」方法可以改變函數(實際上是返回了一個新的函數)的「this」:

Countdown.prototype.start = function() {  this._step();  this._timer = setInterval(function() {    this._step();  }.bind(this), 1000);};

箭頭函數

這正是本文要重點介紹的解決方案。箭頭函數是ES6中新增的語言特性,表面上看,它只是使匿名函數的編碼更加簡短,但實際上它還隱藏了一個非常重要的細節――箭頭函數會捕獲其所在上下文的this作為自己的this。也就是說,箭頭函數內部與其外部的this是保持一致的。

所以,解決方案如下:

Countdown.prototype.start = function() {  this._step();  this._timer = setInterval(() => {    this._step();  }, 1000);};

這無疑使this的處理更加方便了。然而,對各位Javascript Coder而言,判斷this指向時的情況可就又多了一種了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平定县| 云林县| 沅江市| 永平县| 桐庐县| 黄龙县| 苍梧县| 西贡区| 阿合奇县| 师宗县| 青海省| 阳信县| 桂平市| 双牌县| 郸城县| 新兴县| 泌阳县| 托克托县| 庄河市| 江川县| 沈阳市| 璧山县| 建湖县| 武定县| 乐陵市| 长春市| 乐业县| 铜梁县| 隆昌县| 繁峙县| 清流县| 横峰县| 昌宁县| 南丰县| 松溪县| 肥乡县| 惠州市| 论坛| 中山市| 牙克石市| 韶山市|