闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,创建的函数可以访问到当前函数的局部变量。
闭包有两个常用的用途:
1.使我们在函数外部能够访问到函数内部的变量。
2.使已经运行结束的函数上下文中的变量对象继续留在内存中,因为闭包函数保留了这个变量对象的引用,所以这个变量对象不会被回收。
闭包可以构造函数的私有属性、对函数进行节流、防抖操作。但是如果我们滥用闭包,函数中的变量都被保存在内存中,内存消耗很大,造成网页的性能问题,且容易造成内存泄漏。解决方法是在退出函数之前,将不使用的局部变量全部删除。
function A() { let a = 1 function B() { console.log(a) } return B }
for ( var i=1; i<=5; i++) { setTimeout( function timer() { console.log( i ); }, i*1000 ); }
setTimeout 是个异步函数,所有会先把循环全部执行完毕,那么这时候 i 就是 6 了,所以结果会输出一堆 6。for (var i = 1; i <= 5; i++) { (function(j) { setTimeout(function timer() { console.log(j); }, j * 1000); })(i); }
setTimeout 的第三个参数for ( var i=1; i<=5; i++) { setTimeout( function timer(j) { console.log( j ); }, i*1000, i); }
var和let的主要区别在于:let作用域是块级的,而不是函数级别的。这就意味着使用let关键字创建的变量在创建它的“块”内以及任何嵌套块中都可用。说的“块”指的是在for循环或if语句中用花括号{}包围的任何东西。
{ // 形成块级作用域
let i = 0
{
let ii = i
setTimeout( function timer() {
console.log( i );
}, i*1000 );
}
i++
{
let ii = i
}
i++
{
let ii = i
}
...
}
原文:https://www.cnblogs.com/sgq99/p/15134377.html