闭包与ES6让

Mit*_*tsa 11 javascript

尝试使用闭包和let来打印for循环中的一系列数字:

请考虑以下示例:

  for(var i=1; i<10; i++){      
      setTimeout(function(){
        document.write(i);
      }, 1000);
  }
Run Code Online (Sandbox Code Playgroud)

输出是:

101010101010101010

关闭:

  for(var i=1; i<10; i++){    
    (function(x){      
      setTimeout(function(){
        document.write(x);
      }, 1000);      
    })(i);
  }
Run Code Online (Sandbox Code Playgroud)

输出是:

123456789

没有关闭,只需使用ES6让:

 for(let i=1; i<10; i++){      
      setTimeout(function(){
        document.write(i);
      }, 1000);
  }
Run Code Online (Sandbox Code Playgroud)

输出是:

123456789

试图了解我们是否还需要使用IIFE块来关闭ES6?

如果我们真的需要使用ES6闭包,那还有什么好的例子吗?

Dan*_* D. 5

let在块作用域中为使用它声明的变量绑定名称.您可以阅读标准文档中的语义.

如果有let,请使用它.否则使用IIFE或重写代码以避免需要.


Noa*_*nos 5

以下是Kleo Petrov的一个很好的解释 -

ES6模块是否会使IIFE的情况过时?

IIFE是ES5中使用最多的模式之一,因为函数是声明范围代码块的唯一方法.在ES6中,我们可以使用模块而不是使用IIFE:

// myModule.js

let counter = 0;

export function increment() {
    counter++;
}    

// logic.js

import {increment} from 'myModule.js';

increment();
Run Code Online (Sandbox Code Playgroud)

您可能希望在ES6中使用IIFE的唯一情况是使用立即调用的箭头函数,这需要多个表达式,例如:

const SENTENCE = 'Hello world, how are you?';
const REVERSE = (() => {
    const array  = [...SENTENCE];
    array.reverse();
    return arr.join('');
})();
Run Code Online (Sandbox Code Playgroud)