JavaScript原型與閉包相關
1什么是對象
js中的值分為引用值和原始值
原始值:undefined null Boolean string number 原始值無法更改 存放在棧中
引用值:Array Object Function 引用值可更改 指向引用值的指針存放在棧中 數據存放在堆中 當相互賦值時 只是把棧中的指針賦給對方
對象:一切引用類型都是對象,對象是屬性的集合
對象都是通過函數創建的 函數都是對象
語法糖:指計算機語言中添加的某種語法,這種語法對語言的功能并沒有影響,但是更方便程序員使用。通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會。
2. 原型 -- prototype
js函數的默認屬性 -- prototype 屬性值為一個對象 對象中僅包含constructor constructor指向函數本身
Object.prototypt

3.隱式原型 -- __proto__
對象有個默認的屬性 __proto__ 他絕對等于創建他的函數的prototype
即function a () {}
var b = new a();
b.__proto__ === a.prototype
obj.__proto === Object.prototype
圖示

特例
Object.prototype也是個對象 但是他的__proto__ 為null;


另外:__proto__是原型訪問器。目前原型訪問器,有3類:標準原型訪問器Object.getPrototypeOf(object);該訪問器,火狐和谷歌差不多都支持。其次,是非標準訪問器object.__proto__,對的就是你正在使用的這個,這個訪問器,IE不支持,估計也還有其他基于IE內核的瀏覽器也不支持,所以并不是每一個對象都有它。最后就是通用訪問器,object.constructor.prototype去得到原型。
原型鏈完整圖

有待進一步理解
4.typeof() .. instanceof ..
typeof()是可以判斷括號中參數的類型 但只限于原始類型 在引用類型中 他只返回function/object
A instanceof B 則表示一種繼承關系 規則為
沿著A的__proto__這條線來找,同時沿著B的prototype這條線來找,如果兩條線能找到同一個引用,即同一個對象,那么就返回true。如果找到終點還未重合,則返回false。
5.原型鏈
訪問一個對象的屬性時,先在基本屬性中查找,如果沒有,再沿著__proto__這條鏈向上找,這就是原型鏈。
fn.hasOwnPrototype(item) 可以判斷item是fn本身的 還是fn原型鏈上的 來自Object.prototype的屬性
call apply等來自js提供的Function.prototype中
6.執行上下文
全局變量下:
變量/函數表達式 -- 提前聲明 undefined
函數聲明 -- 提前聲明 并賦值
this -- 賦值
函數下:
在函數聲明的時候,內部的自由變量等就已經確定了其作用域 函數每被調用一次,都會生成一個新的執行上下文


7.this的指向
this指向調用該函數的對象
注意
當一個函數被call和apply調用時,this的值就取傳入的對象的值
這種情況下函數f的this仍為window
8.執行上下文棧
處于活動狀態的執行上下文環境只有一個。
其實這是一個壓棧出棧的過程——執行上下文棧

9.作用域
javascript除了全局作用域之外,只有函數可以創建的作用域。
我們在聲明變量時,全局代碼要在代碼前端聲明,函數中要在函數體一開始就聲明好。除了這兩個地方,其他地方都不要出現變量聲明。而且建議用“單var”形式
作用域最大的用處就是隔離變量,不同作用域下同名變量不會有沖突
作用域只是一個“地盤”,一個抽象的概念,其中沒有變量。要通過作用域對應的執行上下文環境來獲取變量的值
作用域中變量的值是在執行過程中產生的確定的,而作用域卻是在函數創建時就確定了。
如果要查找一個作用域下某個變量的值,就需要找到這個作用域對應的執行上下文環境,再在其中尋找變量的值。
作用域是靜態的組織結構,上下文是動態的計算。
10.自由變量
在A作用域中使用的變量x,卻沒有在A作用域中聲明(即在其他作用域中聲明的),對于A作用域來說,x就是一個自由變量。
自由變量要到創建這個函數的那個作用域中取值——是“創建”,而不是“調用”
11.作用域鏈

12.閉包
閉包應用的兩種情況:
函數作為返回值,函數作為參數傳遞。
使用閉包會增加內容開銷
筆記總結來源http://www.rzrgm.cn/wangfupeng1988/p/4001284.html
大佬寫的很棒
浙公網安備 33010602011771號