JavaScript中的this陷阱的最全收集--沒有之一

當有人問起你JavaScript有什么特點的時候,你可能立馬就想到了單線程、事件驅動、面向對象等一堆詞語,但是如果真的讓你解釋一下這些概念,可能真解釋不清楚。有句話這么說:如果你不能向一個6歲小孩解釋清楚一個東西,那么你自己也不懂這個東西。這句話或許有點夸張,但是極其有道理。個人覺得,如果需要掌握一門語言,掌握它的API只是學了皮毛,理解這門語言的精髓才是重點。提及JavaScript的精髓,this、閉包、作用域鏈、函數(shù)是當之無愧的。這門語言正式因為這幾個東西而變得魅力無窮。

博客的標題是《JavaScript中的this陷阱的最全收集--沒有之一》,很顯然這篇博客闡述的是this。相信做過JavaScript開發(fā)的人都遇到過不少this的陷阱,我自己本身也遇到過不少坑,但是如果非要給出一個系統(tǒng)的總結的話,還沒有足夠的底蘊。非常幸運的是,今天早上起來看《Hacker News》的時候,恰巧看到了一篇有關于JavaScript this的解析:all this。于是,本著學習和共享的精神,決定將它翻譯成中文。翻譯的目的絕對不是為了當大自然的搬運工,在這個過程中會完全弄明白別人的著作,加深認識,同時將好東西分享給別人,才能讓更多的學習者站在巨人的肩膀上前進。按照我自己的習慣,會翻譯的過程中加上一些自己解釋(引用部分),畢竟中西方人的思考方式是有差異的。當然文章標題所述的最全也不是吹的,文章非常長。

原文翻譯:

JavaScript來自一門健全的語言,所以你可能覺得JavaScript中的this和其他面向對象的語言如java的this一樣,是指存儲在實例屬性中的值。事實并非如此,在JavaScript中,最好把this當成哈利波特中的博格特的背包,有著深不可測的魔力。

下面的部分是我希望我的同事在使用JavaScript的this的時候應當知道的。內容很多,是我學習好幾年總結出來的。

JavaScript中很多時候會用到this,下面詳細介紹每一種情況。在這里我想首先介紹一下宿主環(huán)境這個概念。一門語言在運行的時候,需要一個環(huán)境,叫做宿主環(huán)境。對于JavaScript,宿主環(huán)境最常見的是web瀏覽器,瀏覽器提供了一個JavaScript運行的環(huán)境,這個環(huán)境里面,需要提供一些接口,好讓JavaScript引擎能夠和宿主環(huán)境對接。JavaScript引擎才是真正執(zhí)行JavaScript代碼的地方,常見的引擎有V8(目前最快JavaScript引擎、Google生產)、JavaScript core。JavaScript引擎主要做了下面幾件事情:

  • 一套與宿主環(huán)境相聯(lián)系的規(guī)則;
  • JavaScript引擎內核(基本語法規(guī)范、邏輯、命令和算法);
  • 一組內置對象和API;
  • 其他約定。

但是環(huán)境不是唯一的,也就是JavaScript不僅僅能夠在瀏覽器里面跑,也能在其他提供了宿主環(huán)境的程序里面跑,最常見的就是nodejs。同樣作為一個宿主環(huán)境,nodejs也有自己的JavaScript引擎--V8。根據(jù)官方的定義:
Node.js is a platform built on Chrome’s JavaS

網(wǎng)友評論