//理解閉包和立即執行函式
//1.閉包
function count()
i = 5;
count(); //1
var c1 = count; //變數i在函式呼叫完一次就被銷毀
c1(); //1
c1(); //1
//如何實現乙個簡單的計時器,採用閉包
function count2()
}var c2 = count2();
c2(); //1
c2(); //2
c2(); //3
var c3 = count2();
c3(); //1
c3(); //2
c3(); //3
//每次呼叫「count2()」函式後就會生成乙個計數器,而且不同的計數器之間不干擾。因為兩次呼叫同乙個函式,建立的棧是不同
// 的,因此棧內的區域性變數是不同的。上例中,我們生成了全域性計數器「c2」和「c3」,他們都是不帶引數的函式,即「count2()」
// 中返回的匿名函式。此後每次呼叫計數器,比如「c2()」,計數器就會自增1並返回。但是由於「count2()」函式已經呼叫完畢,
// 我們將無法通過任何其他辦法去修改「count2()」中變數「i」的值。這就是閉包最實用的功能,就是將你想操作的變數或物件隱
// 藏起來,只允許特定的方法才能訪問它。
function count3() ();
}var c21 = count3;
c21(); //1
c21(); //1
c21(); //1
var c31 = count3;
c31(); //1
c31(); //1
c31(); //1
//2.立即執行函式
var car = ,
getspeed: function()
}car.start();
car.getspeed(); //40
car.speed = 60;
car.getspeed(); //60
//成員變數沒有辦法私有化
function car2() ,
addspeed: function() ,
getspeed: function()
}}var car1 = car2();
car1.start();
car1.getspeed(); //40
car1.addspeed();
var car2 = car2();
car2.start();
car1.getspeed(); //60
car2.getspeed(); //40(car2的speed未改變)
//你有了閉包函式來幫你建立「car」物件,這個函式就類似於工廠方法,它可以根據你的需要建立多個不同的物件。
//不過開發的時候經常遇到這樣的情況,就是我們希望物件只有乙份,比如jquery庫的物件,它必須確保整個程式只有乙份,多
// 了也沒有。在後端開發模式中,這叫單例模式,可以通過私有化建構函式來實現,那麼在js裡呢?
//既然函式沒法私有化,那麼唯一的辦法就是讓這個工廠方法能且只能被呼叫一次。不能多次呼叫,那這個函式一定要是匿名函
// 數;而且能被呼叫一次, 那就必須在宣告的時候立馬執行。這時候,我們就可以邀請立即執行函式出場了:
var car3 = (function () ,
addspeed: function() ,
getspeed: function()
}})();
// var car4 = car3(); //typeerror: car3 is not a function
car3.start()
car3.getspeed(); //40
//很多人一開始會看錯,認為物件「car」是乙個函式,其實它是這個匿名的工廠方法執行完返回的物件,該物件擁有「start」
// 「getspeed」和「addspeed」三個個成員函式,而這兩個函式所需要訪問的「speed」變數對外不可見。同時你無法再次呼叫
// 這個匿名的工廠方法來建立乙個相同的物件。是不是很神奇?乙個單例的,有著私有成員的物件就這麼建好了。
閉包與立即執行函式理解與區別
內部函式被外部函式以外的變數引用時,就形成了乙個閉包 function outter var a outter a 內部函式inner被外部函式outter以外的變數a引用閉包是函式內部和外部聯絡起來的橋梁。這樣函式外部就可以讀取函式內部的變數,讓這些變數的值一直儲存在記憶體中。但凡是當前活動物件中...
js高階篇 閉包和立即執行函式
先上一段 function formatter value,row,index type post datatype json success function success data else if data.status 0 else if data.code 0 error function...
js 作用域,作用域鏈,立即執行函式,閉包
作用域 1全域性作用域 全域性作用域就是最外層函式定義的變數,對任何內部函式來說,都是可以訪問的。2.區域性作用域 區域性作用域就是只在固定 片段內可以訪問到,在函式外部是無法訪問的。函式外是不可以訪問到函式內的,所以報錯。作用域鏈 scope 中所儲存的執行期上下文物件的集合,這個集合成鏈式鏈結,...