试图使用闭包和let在循环中打印一系列数字:
请考虑以下示例:
for(var i=1; i<10; i++){
setTimeout(function(){
document.write(i);
}, 1000);
}
产出如下:
101010101010101010
有闭包:
for(var i=1; i<10; i++){
(function(x){
setTimeout(function(){
document.write(x);
}, 1000);
})(i);
}
产出如下:
123456789
如果没有闭包,只需使用ES6 let:
for(let i=1; i<10; i++){
setTimeout(function(){
document.write(i);
}, 1000);
}
产出如下:
123456789
试图理解我们是否还需要使用understand来实现ES6的闭包呢?
如果我们真的需要使用ES6的闭包,有什么好的例子吗?
发布于 2017-05-01 17:29:49
克莱奥·彼得罗夫给出了一个很好的解释
IIFE是ES5中最常用的模式之一,因为函数是声明作用域代码块的唯一方法。在ES6中,我们可以使用模块,而不是使用IIFE:
// myModule.js
let counter = 0;
export function increment() {
counter++;
}
// logic.js
import {increment} from 'myModule.js';
increment();
您可能希望在ES6中使用IIFE的唯一情况是使用一个立即调用的箭头函数,它需要多个表达式,例如:
const SENTENCE = 'Hello world, how are you?';
const REVERSE = (() => {
const array = [...SENTENCE];
array.reverse();
return array.join('');
})();
发布于 2017-01-27 11:17:36
我记得,使用闭包的一个简单例子是一个计数器:
function makeCounter() {
let currentCount = 1;
return function() {
return currentCount++;
};
}
let counter = makeCounter();
console.log( counter() ); // 1
console.log( counter() ); // 2
console.log( counter() ); // 3
发布于 2017-01-27 11:20:10
let
在块作用域中为它声明的变量绑定名称。您可以在标准文档中读取语义。
如果你有let
,就用它。否则,使用生命或重写代码,以避免任何一个。
https://stackoverflow.com/questions/41892488
复制相似问题