闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,创建的函数可以访问到当前函数的局部变量。
闭包有两个常用的用途:
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