-
在大多数人眼里,闭包是难于理解的,晦涩难懂的,其实只要我们写过js,不管你懂不懂,闭包的身影早已出现在你的代码中了
通俗的说就是,声明在一个函数中的函数function closure () { var a = 1; function inner () { console.log(a); } return inner; } var func = closure() func() // a = 2
-
a变量和inner函数就构成了一个闭包, fuc访问了closure的内部词法作用域
闭包其实是JS函数作用域的副产品 -
在ES6之前,没有块级作用域,只有全局作用域和局部作用域(函数作用域),
-
内部的作用域可以访问到外部作用域中的变量和方法,而外部作用域不能访问内部作用域的变量和方法,
-
当前作用域没有此变量或方法,会向外部作用域寻找变量或方法
-
无论通过什么手段将内部函数传递到所在的词法作用域之外,它都会保持对定义时作用域的引用,这个函数无论在何处执行,都产生了闭包
function updateTime(msg) { setTimeout(function timer() { console.log(msg) }, 1000) } 将函数timer传递给setTimeout(),内部函数timer 保持了对updateTime的作用域的引用,1000毫秒后打印出msg
for (var i = 1; i <= 5; i++){ setTimeout(function timer() { console.log(i) },i*1000) }
正常的话,每隔一秒输出一个数字,1-5。实际却是每间隔一秒输 出一个数字6。这是为什么?
for循环了5次,创建了5个闭包,但是都是保持了对同一个i的引用(i是全局变量)。所以当timer执行时,i = 6,输出6。
详解JavaScript闭包原理
最新推荐文章于 2024-01-18 09:28:13 发布