美文网首页
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