首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >闭包与ES6让

闭包与ES6让
EN

Stack Overflow用户
提问于 2017-01-27 11:04:51
回答 4查看 10.5K关注 0票数 18

试图使用闭包和let在循环中打印一系列数字:

请考虑以下示例:

代码语言:javascript
运行
复制
  for(var i=1; i<10; i++){      
      setTimeout(function(){
        document.write(i);
      }, 1000);
  }

产出如下:

101010101010101010

有闭包:

代码语言:javascript
运行
复制
  for(var i=1; i<10; i++){    
    (function(x){      
      setTimeout(function(){
        document.write(x);
      }, 1000);      
    })(i);
  }

产出如下:

123456789

如果没有闭包,只需使用ES6 let:

代码语言:javascript
运行
复制
 for(let i=1; i<10; i++){      
      setTimeout(function(){
        document.write(i);
      }, 1000);
  }

产出如下:

123456789

试图理解我们是否还需要使用understand来实现ES6的闭包呢?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-05-01 17:29:49

克莱奥·彼得罗夫给出了一个很好的解释

ES6模块是否使IIFE过时了?

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

代码语言:javascript
运行
复制
// myModule.js

let counter = 0;

export function increment() {
    counter++;
}    

// logic.js

import {increment} from 'myModule.js';

increment();

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

代码语言:javascript
运行
复制
const SENTENCE = 'Hello world, how are you?';
const REVERSE = (() => {
    const array  = [...SENTENCE];
    array.reverse();
    return array.join('');
})();
票数 7
EN

Stack Overflow用户

发布于 2017-01-27 11:17:36

我记得,使用闭包的一个简单例子是一个计数器:

代码语言:javascript
运行
复制
function makeCounter() {
  let currentCount = 1;

  return function() { 
    return currentCount++;
  };
}

let counter = makeCounter(); 


console.log( counter() ); // 1
console.log( counter() ); // 2
console.log( counter() ); // 3

票数 5
EN

Stack Overflow用户

发布于 2017-01-27 11:20:10

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

如果你有let,就用它。否则,使用生命或重写代码,以避免任何一个。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41892488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档