王福朋:深刻理解javascript原型和閉包javascript
一切都是對象html
對象就是屬性的集合,也就是一堆鍵值對,就連函數也是對象。java
函數與對象的關係瀏覽器
- 對象都是經過函數來建立的
- 每一個函數都有一個屬性,叫作prototype,屬性值是一個對象,該對象默認只有一個屬性,constructor指向函數自己 ``` function.prototype // key = prototype, value = Object
function.prototype.contructor --> function ``` 3. 每一個對象都有一個隱藏的屬性,"__proto__",這個屬性指向建立這個對象的函數(對象)的prototype屬性閉包
原型app
- 自定義函數的prototype指向一個對象,該對象的__proto__指向Object.prototype
- 自定義函數做爲對象,它的__proto__指向Function.prototype
- Object.prototype指向null
- Function.__proto__指向Function.prototype
繼承函數
- A instanceof B,instanceof表示一種關係,或者原型鏈的結構
- A對象的__proto__和B函數的prototype,若是能找到同一個引用,則爲true
- 訪問一個對象的屬性時。如今基本屬性中查找,若是沒有,再沿着__proto__這條鏈想上找,這就是原型鏈
執行上下文this
在一段js代碼執行以前,瀏覽器先作一些準備工做prototype
- 變量、函數表達式(var a = fn(){}),變量聲明,默認賦值爲undefined
- this,賦值
- 函數聲明,賦值
js代碼的執行上下文,相似於java中加載類時的初始化過程。htm
this
分四種狀況
- 構造函數中的this,new的時候表明它即將new出來的對象,直接調用時則不同
- 函數做爲對象的一個屬性被調用時,this指向該對象
- 函數用call或者apply調用,this指向傳入的對象
- 全局、調用普通函數,this指向window
做用域
- js沒有塊級做用域
- 除了全局做用域以外,只有函數能夠建立做用域
- 對於沒有在本做用域聲明的自由變量,取值要到建立這個函數的那個做用域中取值
閉包
- 函數做爲返回值
- 函數做爲參數被傳遞
- 以上兩種狀況,若是函數引用其餘做用域中的自由變量,則造成閉包