第一次寫文章。
無論是生活,情感,還是知識。 都值得我們記錄下來不斷回味。
以下是我這幾天的收獲與感想
1、執(zhí)行上下文。EC(Execute Context)
函數(shù)的執(zhí)行上下文包含了函數(shù)的變量對象,作用域鏈以及this的具體指向
2、變量對象。VO (Variable Object)
變量對象包含了arguments對象,函數(shù)聲明,變量聲明三部分。
在執(zhí)行上下文確定后。進(jìn)行變量對象的生成,包含三個(gè)部分。
1、首先建立了arguments對象!(注:是一個(gè)類似于數(shù)組的對象)。
2、然后檢查執(zhí)行上下文中的函數(shù)聲明,在VO中建立對應(yīng)的函數(shù)名屬性,并指向?qū)?yīng)的內(nèi)存地址。如果有相同的函數(shù)聲明,那么覆蓋
3、最后是檢查執(zhí)行上下文中的變量聲明var,在VO中建立對應(yīng)的屬性,屬性值為undefined,這就解釋了變量聲明??墒侨绻莑et呢?求指導(dǎo)。為了避免與函數(shù)名沖突,如果與已經(jīng)存在的函數(shù)名相同那么就跳過。
最后,全局上下文的變量對象時(shí)window。
3、作用域鏈
可以理解為一個(gè)數(shù)組,存的都是變量對象。數(shù)組最開始是當(dāng)前執(zhí)行上下文中的變量對象,最末端是全局變量對象。
4、閉包?。。?!
原來我真的是看了十幾篇文章對閉包有十幾個(gè)見解的,對于閉包我是真的懵逼,當(dāng)然現(xiàn)在我還是很蒙,可是起碼搞明白了一丟丟。波哥對閉包的理解真的讓我記住了這個(gè)概念。A函數(shù)內(nèi)的B函數(shù)執(zhí)行時(shí)調(diào)用了A函數(shù)中的變量,那么A函數(shù)就形成了一個(gè)閉包。而且閉包的產(chǎn)生一定是B函數(shù)要調(diào)用A函數(shù)的變量。以后還是要多學(xué)習(xí)關(guān)于閉包的用法
5、this
由于深受Java的影響,ES5又沒有類的概念,原來真的搞不明白JavaScript中的this指向的是哪里。波哥的關(guān)于this的見解解開了我的疑惑。簡單的說,和java中的在類中使用一樣,JS中的this指向的也是一個(gè)對象!然后分成兩部分來說明:
a、this是由一個(gè)函數(shù)調(diào)用的。那么如果這個(gè)方法屬于一個(gè)對象,那么這個(gè)this,就是指向這個(gè)對象。如果是獨(dú)立調(diào)用,也就是不屬于對象,可能是函數(shù)內(nèi)部聲明了什么的,那么this就是指向undefined。不是嚴(yán)格模式下,this指向undefined就是指向全局變量
b、this直接在一個(gè)對象內(nèi)部調(diào)用,比如。 ?var obj = { x:1 , y:this.x }。這種東西就像this.x這樣的在對象內(nèi)部的東西,要看這個(gè)obj。如果obj是全局對象,那么this指向全局對象。如果是函數(shù)內(nèi)部的一個(gè)對象,那么this指向undefined。然后跳入a的后面的規(guī)則。
call,apply方法,強(qiáng)制將this指向調(diào)用這兩個(gè)方法后傳入的對象。好繞,就是 ? ? foo.call(obj) ? this---> obj
6、總結(jié)
先記錄這么多,貪多嚼不爛。感謝簡書上這么多大佬對知識的分享。我知道自己的見解肯定會有很大的漏洞和不足,歡迎大佬們指點(diǎn)一二。最后感謝 ? ?這波能反殺 祝你早日成為簽約作者。