小别致真东西
文章77
标签31
分类26
闭包

闭包

闭包是由该函数和其执行上下文共同构成,能够读取其他函数那边变量的函数。
可以用来做数据缓存、对象的私用方法等

闭包一般都会涉及到函数的作用域以及作用域链。
函数作用域:作用域是代码在运行时,各个变量、函数和对象的可访问性,作用域决定了变量在各个区域的可见性,作用域分为全局作用域和局部作用域
作用域链: 作用域链用于解析变量、当解析一个变量时, JavaScript 开始从最内层沿着父级作用域寻找所需的变量或者其他对象,如果没有找到则返回 undefined

通过作用域和作用域链可以实现最小访问原则、利于 bug 的排除、也能够解决一些变量命名冲突的问题

// 原题
for ( var i = 0 ; i < 10 ; ++i ) {
setTimeout(function(){
console.log(i);
},0)
}
// 运行结果: 10 10 10 10 10 10...

// ✔️解 let 声明块级作用域 使变量独立 变量如同 c 和 java 中一样执行
for ( let i = 0 ; i < 10 ; ++i ) {
setTimeout(function(){
console.log(i);
},0)
}
// ✔️解
for ( var i = 0 ; i < 10 ; ++i ) {
setTimeout((function(a){
console.log(a);
})(i),0)
}

// 题
var funcs = [];
for (var i = 0; i < 5; i++){
funcs[i] = function (){
console.log(i);
};
}

funcs[2](); // 5

// ✔️解
var funcs = [];
for (var i = 0; i < 5; i++ ) {
(function(j){
funcs[j] = function(){
console.log(j);
}
})(i)
}

funcs[2]();
// ✔️解
var funcs = [];
for (let i = 0; i < 5; i++){
funcs[i] = function (){
console.log(i);
};
}

funcs[2]();
本文作者:小别致真东西
本文链接:https://heiliu.github.io/2020/07/24/%E9%97%AD%E5%8C%85/
true