感謝做者。javascript
閉包的定義:java
閉包是在另外一個函數(稱爲父函數)中定義的函數,而且能夠訪問在父函數做用域中聲明和定義的變量。編程
閉包能夠訪問三個做用域中的變量閉包
一、在本身做用域中聲明的變量編程語言
二、在父函數中聲明的變量函數
三、在全局做用域中聲明的變量this
var t={ b:1, w:function a(){ var b=2; alert(this.b); //彈出t對象的b屬性 alert(b); //彈出a函數的b變量 return function c(){ alert(this.b);//彈出window對象的b屬性 } } } var b=3; var q=t.w();//先彈出1,再彈出2。此式子獲得了閉包c,c==q q(); //彈出3,c的調用,至關於c(); //w(或者說a)能夠經過.由對象t調用,閉包c的調用直接發生在window中,至關於window.q()
在執行環境中,this的指向只是與如何調用這個方法有關。code
閉包不屬於任何對象,它不是一個對象的方法(就不能使用點運算符調用)。對象
由於js是面向對象的編程語言,全部變量和函數要指定屬於某個對象,若是沒有指定屬於哪一個對象,那麼它就屬於window對象。ip
調用一個變量或者函數必須指定經過哪一個對象調用,例如t對象裏的w方法,須要經過點運算符由t調用,就是t.w(),而t.w()獲得了閉包c。
此時直接調用c就能夠了:t.w()(),至關於c()。注意c是直接調用的,沒有經過哪一個對象,因此默認屬於window。
請注意,:t.w()()中的點運算符調用的是w,與閉包無關。