美文网首页
理解js闭包

理解js闭包

作者: 谢_ffd1 | 来源:发表于2019-02-16 16:48 被阅读0次

    闭包的概念: 闭包就是能够读取其他函数内部变量的函数。
    由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
    所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

    闭包的用途:闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

    面试中笔试题1:

    for (var i = 1; i <= 5; i++) {
    
      setTimeout( function timer() {
    
          console.log(i);
    
      }, 1000 );
    
    }
    

    上面的代码会输出什么?怎么改动上述代码,使其依次输出1、2、3、4、5

    答案是 后面每隔1000毫秒输出一个6

    如何理解:
    凡是类试for循环中嵌套一个方法\color{red}{该方法不是立即执行的}都会将其存入内存中,等待for循环执行完毕再一次执行该嵌套方法,非闭包下for循环每次到得 i 就立即释放 此时完毕 i 理应为5 然而闭包下变量的值始终保持在内存中,i执行到5时还要再去执行一次 i++用于判断 i <= 5的条件 此时 i 就等于6了,此时 console.log(i)中的 i 是从内存中读取的

    如何输出使其依次输出1、2、3、4、5让其立即执行

    for (var i = 1; i <= 5; i++) {
    
     (function(i){
    
                setTimeout( function timer() {
    
                    console.log(i);
    
                },  1000 );
    
            })(i);
    }
    

    或使用块级作用域--关键字let

    for (let i = 1; i <= 5; i++) {
    
      setTimeout( function timer() {
    
          console.log(i);
    
      }, 1000 );
    
    }
    

    面试中笔试题2:

     function foo(x) {
           var tem=3;
           return function (y) {
               alert(x+y+(++tem))
           }
       }
    
       var bar=foo(2);
       bar(10);  //16
    

    理解:

    var bar=foo(2);等效于

      var tem=3;
      var bar=function (y) {
               var  x=2;
               alert(x+y+(++tem))
           }
    

    bar(10);等效于:

      var tem=3;
      var y=10
      var bar=function (y) {
               var  x=2;
               alert(x+y+(++tem))
         }
    

    相关文章

      网友评论

          本文标题:理解js闭包

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