js-函數(閉包)

1:閉包:一個函數外加上該函數所創建時所建立的作用域。閉包的名字來源于閉包“關閉”一個函數中自由變量的訪問的權利。我們所說的變量是自由的,是指該變量定義在函數外部的,而非函數內部。這個不懂。。。。如果一個函數訪問了它的外部變量,那么它就是一個閉包。
2:function create(start){return function(step){start+=step;return start;}};var inc=create(5)(1);
3:閉包是一個代碼執行完成后離開作用域環境依然存在的例子。這個懂。。
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)
}());
}二改,還是出來的函數。返回的數組
6:var result=[];
for(var i=0;i<5;i++){
(function(){
var pos=i;
var func=function(){
return pos;
};
result.push(func)
}());
}三改,
7:函數變量可以保存在函數的作用域內,因此看起來就好像是函數將變量包起來了。包含變量的函數就是閉包。---有權訪問另一個函數作用域內變量的函數就是閉包。
8:函數聲明和函數表達式。給一個函數加上括號就把他從一個聲明變成了表達式。可以直接調用。
9:閉包的三個條件:訪問所在的作用域,函數嵌套,在所在作用域外被調用。
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();和原來出的一樣現在f()函數出來的還是函數,所以要這樣a1;我要取到他的函數,在把這個函數表達出來。但是現在他的值還是4.是最后的,所以要在那里吧那個替換了。var pos=i;來個這個東西。
17:閉包的經常用法:var db = (function() {
// 創建一個隱藏的object, 這個object持有一些數據
// 從外部是不能訪問這個object的
var data = {};
// 創建一個函數, 這個函數提供一些訪問data的數據的方法
return function(key, val) {
if (val === undefined) { return data[key] } // get
else { return data[key] = val } // set
}
// 我們可以調用這個匿名方法
// 返回這個內部函數,它是一個閉包
})();

db('x'); // 返回 undefined
db('x', 1); // 設置data['x']為1
db('x'); // 返回 1
// 我們不可能訪問data這個object本身
// 但是我們可以設置它的成員
17:函數的參數和變量不會被垃圾回收機制所回收,因為他是一只被另一個函數所引用的。
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;};一開始都要這樣:先把原函數取出來。
20:var a=(function(){var a=1;return function(){a++;console.log(a)}})();有那么點意思了,a();執行時變成了這樣。、
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);
    }可以不給上面括號的加參數,但是不能不給下面的傳參數。但是這個是自執行函數,不點擊都會出結果。

24:(function(i){
Oli[i].onclick=function(){
console.log(i);
}
})(i)為什么變成這個就是兩個都要加I而且他還不會是自執行的函數。
15:閉包注意:IE下的內存泄漏:
16:函數表達式的形式:var a=function(){console.log(a)};(function(){console.log(a)})() 函數表達式可以直接加一個()執行。
25:函數聲明會被欲解析出來,如果我們想要在一些語句中實現不用的函數,一定要用函數表達式。匿名函數表達式和具名函數表達式。
26:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 工廠模式類似于現實生活中的工廠可以產生大量相似的商品,去做同樣的事情,實現同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,842評論 2 17
  • 單例模式 適用場景:可能會在場景中使用到對象,但只有一個實例,加載時并不主動創建,需要時才創建 最常見的單例模式,...
    Obeing閱讀 2,104評論 1 10
  • 三、閉包和高階函數 3.1 閉包 3.1.1 變量的作用域 所謂變量的作用域,就是變量的有效范圍。通過作用域的劃分...
    梁同學de自言自語閱讀 1,494評論 0 6
  • ● 閉包基礎 ● 閉包作用 ● 閉包經典例子 ● 閉包應用 ● 閉包缺點 ● 參考資料 1、閉包基礎 作用域和作...
    lzyuan閱讀 961評論 0 0
  • 什么是閉包? 有什么作用閉包:函數對象可以通過作用域鏈相互關聯,函數體內部的變量可以保存在函數的作用域內。 上述代...
    coolheadedY閱讀 754評論 0 0