閉包的概念閉包
什麼是閉包呢? 閉包(Closure),是引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即便已經離開了創造它的環境也不例外。因此,有另外一種說法認爲閉包是由函數和與其相關的引用環境組合而成的實體。函數
其實js中,每一個函數就是一個閉包。函數和本身的內部定義的變量綁定在一塊,組合成的實體就是閉包。只不過在特殊的狀況下,即便函數執行完成了,因爲某些緣由致使函數內部的變量仍然被外界所引用,因此垃圾回收並不釋放函數相關的全部內容,並且將函數和必要的變量組成一個閉包的實體,不釋放,直到沒有外界變量再指向當前的函數的內部的變量那麼閉包就會釋放掉。this
閉包的實例get
例1:it
function Persion() {
var t = {};
t.name = "itcast";
t.age = 19;
return t;
}io
var p = new Persion();
p.age;console
function Persion() {
var ageProp = 19;
var nameProp = "flydragon";
var phone = "110"; //私有變量
function getPhone() { //定義屬性 get 方法
return phone;
}ast
function setPhone( value ){ //定義屬性 set 方法
phone = value || "";
}function
var showFun = function() {
console.log( nameProp + " " + ageProp );
};變量
return {
age : ageProp,
name : nameProp,
show : showFun,
get_phone : getPhone,
set_phone : setPhone
};
}
var p = new Persion();
p.show();
console.log( p.get_phone() );
例2:如何讓嵌套函數的父函數訪問子函數的內部變量?
function father() {
his.get_age = child();
function child() {
var child_value = "child";
return function() {
return child_value;
}
}
}
var f = new father();
//子函數的早已經執行完畢,可是還能訪問到子函數內部的變量值。
f.get_age();
例3:全局變量(或者外部變量)
function father() {
var get_value ;
function child() {
var child_value = 199;
get_value = function() {
return child_value;
}
}
return {
get : get_value;
}
}
var f = new father();
f.get();
例4:
function father() {
this.f_name = "fater";
this.childAge = child();
function child() {
var c_age = 19; //私有變量
return {
set_age : function ( value ) {
c_age = value;
},
get_age : function () {
return c_age;
}
}
}
}
var f = new father(); f.childAge.set_age(188); console.log( f.childAge.get_age() );