簡體   English   中英

為什么要使用IFFE閉包而不是常規閉包?

[英]Why use an IFFE closure over a regular closure?

這兩個閉包示例都具有在后續函數調用中保留count值的好處,而其他情況(如果未使用閉包),則每次函數調用后count都將重置為0。 此外,在這兩種情況下,計數變量(作為塊中的任何let變量)都是私有的,即不可全局訪問。

IFFE閉包示例改編自Marius Schulz的文章 ,他在其中提出了這種用法。 我可以想到的是,使用IFFE版本的閉包而不是常規版本的唯一好處是,不必命名它(只需將其分配給變量即可再次調用它),或者您確實要為其命名,它將在全局范圍內不可見-因此,有少一個污染全局名稱空間的項目。 我還有其他好處嗎?

定期關閉:

function createCounter() {
  let count = 0;
  return function() {
    ++count;
    return `count equals ${count}`;
  };
};

let counter = createCounter();

console.log(counter()); // count equals 1 
console.log(counter()); // count equals 2

IFFE關閉:

let countingFunction = (function() {
  let count = 0;
  return function() {
    ++count;
    return `count equals ${count}`;
  };
})();

console.log(countingFunction()); // count equals 1
console.log(countingFunction()); // count equals 2

編輯:標記為重復的問題是一個不同的問題,並且所選答案不能回答該問題。

區別在於IIFE閉包只能使用一次 ,而第一個閉包可以在需要時調用以創建新的迭代器,就像生成器一樣。

例如,如果您有一個要按需迭代的排序隊列,則可以使用第二個IIFE版本,但是如果您有兩個隊列,則可以調用countingFunction 兩次以創建單獨的計數器。

但是,如果您只需要一個這樣的計數器,則可以將其包裝為IIFE,以使其清楚將要使用一次,並且只能使用一次,並避免創建不再使用的變量。 (這對腳本優化不是很有用,但對於可讀性而言)

旁注-更一致地命名變量可能會更清楚一點,因為第一個countingFunction與第二個countingFunction完全不同。 當第一個被調用時,它創建了有價值的東西,第二個 創建了。 也許調用第一個makeCounter和第二個counter

定期關閉:

function makeCounter() {
  let count = 0;
  return function() {
    ++count;
    return `count equals ${count}`;
  };
};

let counter = makeCounter();

console.log(counter()); // count equals 1 
console.log(counter()); // count equals 2

IFFE關閉:

let counter = (function() {
  let count = 0;
  return function() {
    ++count;
    return `count equals ${count}`;
  };
})();

console.log(counter()); // count equals 1
console.log(counter()); // count equals 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM