理解閉包和立即執行函式

2021-09-25 07:20:51 字數 2137 閱讀 4596

//理解閉包和立即執行函式

//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 中所儲存的執行期上下文物件的集合,這個集合成鏈式鏈結,...