美文网首页
JS closure

JS closure

作者: 隔壁老王z | 来源:发表于2021-09-07 13:59 被阅读0次

https://segmentfault.com/a/1190000012785212
https://www.cnblogs.com/rubylouvre/p/3345294.html

var a = 100
let b = 200
debugger

可以看到,a被挂载到全局作用域window下,而b有自己的作用域:


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函数产生了闭包:


image.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。在断点中也很容易看到:

相关文章

网友评论

      本文标题:JS closure

      本文链接:https://www.haomeiwen.com/subject/xpuorktx.html