閉包和立即執行函式的區別,立即執行函式和閉包有什麼關係

2021-05-22 05:32:00 字數 4415 閱讀 9059

1樓:匿名使用者

相同點:他們都是函式的一種

特殊形態,並且可以共存。而且閉包配合即時函式「口味更佳」。

不同點:即時函式是定義一個函式,並立即執行。它只能被使用一次,相當於「閱後即焚」。

閉包是指一個函式與它捕獲的外部變數的合體,按照mdn的說法,閉包就像一個物件---一個具有一個方法(行為)和一個或多個私有欄位(狀態)的物件。從這個角度看,閉包是符合物件導向的封裝思想的。

補充:有些同學認為只要一個函式引用了外部變數,那麼就形成了閉包。

立即執行函式和閉包有什麼關係

2樓:匿名使用者

匿名閉包是很常用的**隔離方式,宣告匿名物件並立即執行。匿名函式中宣告的變數和方法以及匿名函式本身不會汙染到函式體外,同時匿名函式的呼叫形成一個閉包,使函式體內可以使用函式體外宣告的變數和方法。

(function () ());

什麼是立即執行函式

3樓:江淮一楠

即執行函式(immediate functions)

立即執行函式模式是一種語法,可以讓你的函式在定義後立即被執行,比如:

[javascript] view plain copy

(function () ());

這種模式本質上就是函式表示式(命名的或者匿名的),在建立後立即執行;

立即執行函式(immediate function)術語不是在ecmascript標準中定義的,但它很短有助於描述和討論模式;

這種模式有一些幾部分組成:

使用函式表示式定義一個函式(函式宣告不能起作用)

在結尾加上一對括號,讓函式立即被執行

將整個函式包裹在一對括號中(只有在你不將函式賦值給一個變數的時候才需要)

下面這種可選的語法形式也是很常見的(注意結尾的一對括號),但jslint趨向於第一種:

[javascript] view plain copy

(function () )();

這種模式是非常有用的,因為它為你初始化**提供了一個作用域的沙箱;

考慮一下下面這種常見的場景:

你的**在頁面**載入完成之後,不得不執行一些設定工作,比如附加時間處理器,建立物件等等,

所有的這些工作只需要執行一次,所以沒有理由建立一個可複用的命名的函式,

但這些**也需要一些臨時的變數,但初始化過程結束後,就再也不會被用到了,

所以將這些變數作為全域性變數不是個好主意,所以我們需要立即執行函式——去將我們所有的**包裹在它的區域性作用域中,不會讓任何變數洩露成全域性變數;

[javascript] view plain copy

(function() ()); // "today is fri, 13"

如果**沒有被包裹在立即執行函式中,那麼區域性變數days,today和msg都將成為全域性變數,初始化**的遺留產物。

立即執行函式的引數(parameters of an immediate function)

你也可以給立即執行函式傳遞引數,就像下面的例子一樣:

[javascript] view plain copy

// prints:

// i met joe black on fri aug 13 2010 23:26:59 gmt-0800 (pst)

(function(who, when) ("joe black", new date()));

通常,全域性變數被作為一個引數傳遞給立即執行引數,這樣它在函式內部不使用window也可以被訪問到:這種方式可以讓**在環境(除了瀏覽器)中更加通用:

[javascript] view plain copy

(function (global) (this));

記住:通常你不應該給立即執行函式傳遞太多的函式,因為它很快會成為一個負擔——為了理解**是如何工作的,你不得不經常上下滾動源**。

立即執行函式的返回值(returned values from immediate functions)

就像其它任何函式一樣,一個立即執行函式也能返回值並且可以複製給其它變數:

[javascript] view plain copy

var result = (function () ());

另外一種實現相同的功能的方法是省略包裹函式的括號,因為當你將立即執行函式的返回值賦值給一個變數時它們不是必需的;

[javascript] view plain copy

var result = function () ();

這種語法是非常簡單的,但它可能看起來有點令人誤導;

如果沒有注意到函式結束的括號,一些人可能就會認為result指向一個函式;

實際上result指向立即執行函式的返回值,在這種情況下是數字 4 。

還有另一種語法可以實現相同的功能:

[javascript] view plain copy

var result = (function () )();

在前面的例子中返回一個基本型別的整數作為立即執行函式的返回值;

但是除了基本型別值,立即執行函式也能返回任何型別的值,包括其它的函式;

那麼,你可以利用立即執行函式的作用域為返回的內部函式私下裡儲存一些資料。

在接下來的例子中,立即執行函式的返回值是一個函式——被賦值給了變數getresult,這個函式簡單的返回了res的值,這個值事先被計算並被儲存在立即執行函式的閉包中:

[javascript] view plain copy

var getresult = (function() ;

} ());

立即執行函式也可以用來定義物件的屬性;

假如,你需要定義一個很可能在物件生命週期中都不會改變的屬性,但在你定義之前,你需要做一下工作去計算出正確的值;

你可以使用立即執行函式去封裝這些工作,並且立即執行函式的返回值將會成為屬性的值,下面的**:

[javascript] view plain copy

var o = ()),

getmsg: function()

};// usage

o.getmsg(); // "call me"

o.message; // "call me"

在這個例子中,o.message是一個字串型別的屬性,不是一個函式,但它需要一個函式在指令碼被載入時被執行並幫忙定義屬性。

好處和用法(benefits and usage)

立即執行函式模式被廣泛使用,它可以幫你封裝大量的工作而不會在背後遺留任何全域性變數。

你定義的所有變數都會成員立即執行函式的區域性變數,所以你不用擔心這些臨時變數會汙染全域性空間。

這種模式經常被使用在書籤工具(bookmarklets)中,因為書籤工具在任何頁面上執行並且保持全域性名稱空間乾淨是非常必要的;

這種模式也可以讓你將獨立的功能封裝在自包含模組中(self-contained modules)。

假如你的頁面是穩定的並且在沒有javascript情況下能正常工作,然後本著逐步加強的想法,你加入了一些**加強頁面某個方面;

你可以將這些**封裝進一個立即執行函式中,並且確保頁面沒有它的情況下也能正常工作。

然後你可以新增更多的加強模組,移除它們,單獨測試它們,允許使用者去禁用它們等等。

你可以使用下面的模板去定義一個函式模組,讓我們叫它module1:

[javascript] view plain copy

// module1 defined in module1.js

(function () ());

js立即執行函式,作用域問題

4樓:匿名使用者

js分為全域性作用域和函式作用域,全域性作用域在函式內部可以訪問到,但是函式內部的變數,外部無法訪問到

var name = 'zhangsan';

(function())()

console.log(name)//函式的作用域,在全域性中無法訪問,這裡結果是張三

var name = 'zhangsan';

(function())()

console.log(name)//lisi

5樓:枝寰溥蔓

陣列索引要為整形

即xx[key]

中的key必須是整形的,你傳的『v』+i

是不對的,應該這樣寫:

(function()

alert("xx.length="

+xx.length);

//???

此處的xx.length為何等於0

return

xx;};

xx2=

function(xx,

key,

value)

;varb=

a();

alert(b);

//顯示的b為何為空?

})();

半包和全包的區別是什麼,裝修半包和全包有什麼區別?

1,全包就是指所有材料人力均有裝修公司來承擔,業主也就是甲方僅需支付錢款即可。這種方式的最大的有點就是省心,適合於經濟實力允許且沒有時間過問裝修的朋友選擇。缺點就是用料方面不省心,裝修公司的用料存在很大的水分,一般業主也不懂這個行業,往往有被宰的風險!如果選擇全包,需要找有信用的公司進行。2,半包就...

牛奶的利樂磚和康美包有什麼區別,利樂包和康美包有什麼區別?

滅菌方法不一樣,保質期也不一樣.市場上常見的玻璃瓶 塑料袋和屋脊型紙盒裝牛奶普遍採用了巴氏滅菌法,鮮牛奶中含有各種生物活性物質 有人稱之為 命脈素 其含量雖少作用卻大,不過它們都十分怕熱。科學家巴斯德通過大量科學實驗證明,如果加工時溫度超過85 牛奶中的營養物質就會被大量破壞,因此人們將低於85 的...

一包5元的煙和一包30多元的煙有什麼區別

菸草會相對比較純一點 抽起來味道也是不一樣的 便宜一點的抽起來就比較辣口沒怎麼能感受得到真正菸草的味道反之,貴一點的煙,菸草的味道就比較真切一點,抽起來就比較舒心 不一樣咯,當然質量也不同了,高的更純點,對人的傷害也小點 是名多錢不是菸草的問題 誰知道20元一包的煙與5元一包的有什麼區別?煙是用農民...