理解js闭包

2019-02-16  本文已影响0人  谢_ffd1

闭包的概念: 闭包就是能够读取其他函数内部变量的函数。
由于在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))
     }
上一篇下一篇

猜你喜欢

热点阅读