1:閉包:一個函數(shù)外加上該函數(shù)所創(chuàng)建時所建立的作用域。閉包的名字來源于閉包“關(guān)閉”一個函數(shù)中自由變量的訪問的權(quán)利。我們所說的變量是自由的,是指該變量定義在函數(shù)外部的,而非函數(shù)內(nèi)部。這個不懂。。。。如果一個函數(shù)訪問了它的外部變量,那么它就是一個閉包。
2:function create(start){return function(step){start+=step;return start;}};var inc=create(5)(1);
3:閉包是一個代碼執(zhí)行完成后離開作用域環(huán)境依然存在的例子。這個懂。。
4:for(var i=0;i<5;i++){ (function(){return function(){return i;}result.push(i)}())};不成功的閉包。
5:var result=[];
for(var i=0;i<5;i++){
(function(){
var func=function(){
return i;
};
result.push(func)
}());
}二改,還是出來的函數(shù)。返回的數(shù)組
6:var result=[];
for(var i=0;i<5;i++){
(function(){
var pos=i;
var func=function(){
return pos;
};
result.push(func)
}());
}三改,
7:函數(shù)變量可以保存在函數(shù)的作用域內(nèi),因此看起來就好像是函數(shù)將變量包起來了。包含變量的函數(shù)就是閉包。---有權(quán)訪問另一個函數(shù)作用域內(nèi)變量的函數(shù)就是閉包。
8:函數(shù)聲明和函數(shù)表達式。給一個函數(shù)加上括號就把他從一個聲明變成了表達式。可以直接調(diào)用。
9:閉包的三個條件:訪問所在的作用域,函數(shù)嵌套,在所在作用域外被調(diào)用。
10:初級階段:function f(value){var b=value;return function(){return b;}};f('libateer')();
11:高級一點:var n;function f(){var b=1123;n=function(){return b;}};n();
12: 在高級一點:function show(first,last){var name="hello";function make(){return name+first+""+last}return make()};show("lilei","wanggua");
13:在高級一點:(function (first,last){var name="hello";function make(){return name+first+""+last}return make()})(str,str);
14:for(var i=0;i<7;i++){(function (first,last){var name="hello";function make(){return name+first+""+last}return make()})(i-100,i+100);}和上面那個差不多了吧。。
15:在在高級一點:function hello(){var name=999;return {get:function(){return name;},set:function(id){name=id;}}}var f1=hello();f1.set('lailai');f1.get();
16:找到那個怎么搞的了?function f(){var a=[];for(var i=0;i<4;i++){a[i]=function(){return i;}}return a;};var a=f();和原來出的一樣現(xiàn)在f()函數(shù)出來的還是函數(shù),所以要這樣a1;我要取到他的函數(shù),在把這個函數(shù)表達出來。但是現(xiàn)在他的值還是4.是最后的,所以要在那里吧那個替換了。var pos=i;來個這個東西。
17:閉包的經(jīng)常用法:var db = (function() {
// 創(chuàng)建一個隱藏的object, 這個object持有一些數(shù)據(jù)
// 從外部是不能訪問這個object的
var data = {};
// 創(chuàng)建一個函數(shù), 這個函數(shù)提供一些訪問data的數(shù)據(jù)的方法
return function(key, val) {
if (val === undefined) { return data[key] } // get
else { return data[key] = val } // set
}
// 我們可以調(diào)用這個匿名方法
// 返回這個內(nèi)部函數(shù),它是一個閉包
})();
db('x'); // 返回 undefined
db('x', 1); // 設(shè)置data['x']為1
db('x'); // 返回 1
// 我們不可能訪問data這個object本身
// 但是我們可以設(shè)置它的成員
17:函數(shù)的參數(shù)和變量不會被垃圾回收機制所回收,因為他是一只被另一個函數(shù)所引用的。
18:閉包的好處:希望一個變量長期的駐扎到里面,避免全局變量的污染。
19:回到初級:function aaa(){var a=1;return function(){a++;console.log(a)}};var b=aaa()不論是這種形式,還是下面的function aaa(){var a=1;var a=function(){a++;console.log(a)};return a;};一開始都要這樣:先把原函數(shù)取出來。
20:var a=(function(){var a=1;return function(){a++;console.log(a)}})();有那么點意思了,a();執(zhí)行時變成了這樣。、
21:用法:模塊化代碼,私有成員方法的存在。
22:var a=(function(){
var a=1;
function a1(){
a++;
console.log(a);
}
function a2(){
a+=3;
console.log(a+100);
}
return {
a1:a1,
a2:a2
}
})()我讓他私有了。。a.a1();
23:又來了:window.onload=function(){
var Oli=document.getElementsByTagName('li');
for(var i=0;i<Oli.length;i++){
var pos=i;
Oli[i].onclick=(function(){
console.log(pos);
})(pos);
}--改造以后for(var i=0;i<Oli.length;i++){
Oli[i].onclick=(function(i){
return function(){console.log(i)}
})(i);
}可以不給上面括號的加參數(shù),但是不能不給下面的傳參數(shù)。但是這個是自執(zhí)行函數(shù),不點擊都會出結(jié)果。
24:(function(i){
Oli[i].onclick=function(){
console.log(i);
}
})(i)為什么變成這個就是兩個都要加I而且他還不會是自執(zhí)行的函數(shù)。
15:閉包注意:IE下的內(nèi)存泄漏:
16:函數(shù)表達式的形式:var a=function(){console.log(a)};(function(){console.log(a)})() 函數(shù)表達式可以直接加一個()執(zhí)行。
25:函數(shù)聲明會被欲解析出來,如果我們想要在一些語句中實現(xiàn)不用的函數(shù),一定要用函數(shù)表達式。匿名函數(shù)表達式和具名函數(shù)表達式。
26: