https://segmentfault.com/a/1190000012785212
https://www.cnblogs.com/rubylouvre/p/3345294.html
var a = 100
let b = 200
debugger
可以看到,a被挂载到全局作用域window下,而b有自己的作用域:
![](https://img.haomeiwen.com/i12602393/8076afcf4e50684f.png)
function makePow(pow) {
return function(num) {
return Math.pow(num, pow)
}
}
const pow2 = makePow(2)
debugger
const pow3 = makePow(3)
debugger
console.log(pow2(4))
console.log(pow2(5))
console.log(pow2(4))
在断点处可以看到pow2函数产生了闭包:
![](https://img.haomeiwen.com/i12602393/fa4ca87e5c0142ec.png)
思考:
// 一
for (var i=1; i<=5; i++) {
(function(i) {
setTimeout( function timer() {
console.log(i);
}, i*100 );
})(i)
}
// 二
for (var i=1; i<=5; i++) {
setTimeout( function timer() {
console.log(i);
}, i*100 );
}
这道题都知道会依次输出1、2、3、4、5,那原理是什么?setTimeout
第一个参数是一个函数,执行时在这个函数中访问了上层作用域的变量i。在for循环结束后,i变成了6,因此在二中函数timer中的i取到的都是6。而在一中因为外层有匿名函数包裹,在timer
函数中引用了外层函数中的变量,因此形成了闭包,因此在timer里取到的i都是closure中的i。在断点中也很容易看到:
![](https://img.haomeiwen.com/i12602393/5aba1b2f086c0bd7.png)
网友评论