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