找回密码

基础面试23:什么是闭包(closure),为什么要用它?突破作用域链

提示:后面画图精髓。

闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部

闭包的特性:

1.函数内再嵌套函数

2.内部函数可以引用外层的参数和变量

3.参数和变量不会被垃圾回收机制回收

//li节点的onclick事件都能正确的弹出当前被点击的li索引

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<script src="https://cdn.bootcss.com/vue/2.5.6/vue.js"></script>
<style type="text/css">
</style>
</head>
<body>
<ul id="testUL">
<li> index = 0</li>
<li> index = 1</li>
<li> index = 2</li>
<li> index = 3</li>
</ul>
<script type="text/javascript">
var nodes = document.getElementsByTagName("li");
for (var i = 0; i < nodes.length; i += 1) {
nodes[i].onclick = (function(i) {
return function() {
console.log(i);
} // 不用闭包的话,值每次都是4
})(i);
}
</script>
</body>
</html>


还是画图解释什么是闭包吧。

function outside() {
var num = 999;
var inside = function() {
alert(num);
}
num++;
return inside;
}
var inside = outside();
inside() ;

核心解释

外部需要内部的变量,但是外部不能访问内部。比如红框需要蓝筐变量num,我们可以返回绿框,因为绿框在内,绿框可以访问蓝框绿框被return返回到外部红框,它依然能够访问蓝框,所以突破了外部作用域不能访问内部作用域的限制。

相关推荐