1.什麼是閉包
正常函式,執行完畢後相關的引數,變數就釋放掉了。
當乙個函式的返回值是另乙個函式時,該函式的相關引數和變數都會儲存在返回的函式中,這種結構叫做閉包。
2.示例
計算陣列和
function sum(arr) )
}result = sum([1,3,5])
console.log(result)
執行結果:9
如果我們不想立即求和,在後面才執行,該怎麼做?
function lazy_sum(arr) )
}return sum
}result = lazy_sum([1,3,5])
console.log(result())
lazy_sum([1,3,5])返回乙個計算和的函式,[1,3,5]引數作為返回函式的變數,會一直被返回函式引用。result就是閉包函式。
3.閉包函式容易引發的問題
引數和變數會一直被返回函式引用,如果改變引數或變數的值,那麼執行時引用的也是最新的值,
所以應該避免使用會發生變化的變數,作為閉包函式的引數或變數。如:
function count() );
}return arr;
}var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];
f1()
f2()
f3()
執行結果:16 16 16
因為i的值已經發生改變了
4.必須引用會發生變化的變數情況
唯一的解決辦法是將閉包函式中的變數的值固定,這樣做,閉包函式已經不引用變數了,相當於使用常量。
如何把變數的值固定呢?
在閉包函式外層再包裹一層函式,將變數作為引數傳遞,並立即執行,這樣閉包函式中變數的值就繫結了。
function count()
})(i));
}return arr;
}var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];
f1(); // 1
f2(); // 4
f3(); // 9
5.閉包函式的作用
閉包函式引用的變數,外部無法訪問,可以理解為乙個靜態私有變數。
可以想象的使用場景,如計數器等。
javascript基礎拾遺 二
1.物件定義 定義屬性 var language console.log language.name console.log language.score 定義方法 var language console.log language.name console.log language.score c...
NHibernate基礎拾遺
configuration 用於配置並啟動nhibernate,通過此例項來獲取物件關係對映檔案中的元資料 可以通過此例項動態配置nhibernate的屬性 此例項可以建立sessionfactory sessionfactory 乙個這個型別的例項對應乙個資料儲存源 可以建立session的例項 ...
NHibernate基礎拾遺
configuration 用於配置並啟動nhibernate,通過此例項來獲取物件關係對映檔案中的元資料 可以通過此例項動態配置nhibernate的屬性 此例項可以建立sessionfactory sessionfactory 乙個這個型別的例項對應乙個資料儲存源 可以建立session的例項 ...