国产探花免费观看_亚洲丰满少妇自慰呻吟_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指向時的情況可就又多了一種了。

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安图县| 鄂州市| 德格县| 湘西| 塘沽区| 长治县| 丹东市| 隆回县| 苏州市| 大方县| 邵阳县| 兰西县| 九龙坡区| 甘孜| 共和县| 尚志市| 雅江县| 浦东新区| 宜兰县| 兰考县| 赞皇县| 紫金县| 安国市| 中山市| 安福县| 丘北县| 潼关县| 安平县| 江陵县| 大荔县| 綦江县| 泰顺县| 绍兴市| 金昌市| 常宁市| 阳原县| 阳原县| 鄂托克旗| 浦东新区| 金平| 江西省|