javaScript基础面试题 ---闭包

闭包

  • 1、闭包是什么?
  • 2、闭包可以解决什么问题?
  • 3、闭包的缺点

1、闭包是什么?

闭包是一个函数加上到创建这个函数的作用域的链接,就是一个作用域可以访问到另一个作用域的变量,闭包‘关闭’了函数的自由变量

function fun(){
    var a = 10;
    console.log( a )
}
fun()

函数都有垃圾回收机制,上面的这个函数,在运行完之后变量a就被回收了,但是下面的函数:


function fun(){
    var a = 10;
    return function () { 
        console.log( a )
     }
}
fun()()

执行完之后变量a并没有被回收,原因是如果被回收了,打印a是会报错的。

那这是为什么呢?
闭包关闭了函数的自由变量,也就是变量不会被回收。

2、闭包可以解决什么问题?

能够完成同步任务与事件循环任务之间传递参数

看下面的例子:

var lis = document.getElementsByTagName('li')
for(var i = 0;i < lis.length;i ++){
        lis[i].onclick = function(){
            alert(i)
        }
}

1、先执行同步任务,i=4
2、执行事件循环,所以alert的i始终是4


var lis = document.getElementsByTagName('li')
for(var i = 0;i < lis.length;i ++){

    (function (i) { 
        lis[i].onclick = function(){
            alert(i)
        }
     })(i)
}

1、使用闭包传值
2、成功实现每次打印出正确的i

3、闭包的缺点

1、变量会驻留在内存中,造成内存损耗问题。
解决方式:把闭包的函数设置为null,如何设置呢,看下面:

var lis = document.getElementsByTagName('li')
for(var i = 0;i < lis.length;i ++){

    (function (i) { 
        lis[i].onclick = function(){
            alert(i)
        }
        lis[i] = null
     })(i)

}

2、内存泄漏(ie) ==>可说可不说,如果说一定要提到ie浏览器,因为火狐、chrome浏览器都不会造成这个问题

你可能感兴趣的:(前端JS面试题,javascript,前端,chrome)