版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Richard1997/article/details/87119830
按照维基百科里的话来说,闭包可以这样定义:
在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。
直接看不好理解,下面直接看例子closure.html:
<!DOCTYPE html>
<html lang="cn">
<head>
<meta charset="UTF-8">
<title>closure</title>
<script type="text/javascript">
function show(num) {
return function() {
alert(num);
}
}
var f1 = show(3);
f1();
</script>
</head>
<body>
</body>
</html>
用chrome浏览器打开直接弹出3。
如果和维基百科中话对应起来,那么"自由变量"就是show函数的参数num,return的内嵌函数就是"引用了自由变量的函数"。
最后“离开了创造它的环境”指的是变量f1引用到了返回的匿名函数,而且还把值3给传进去了。当最后调用f1时,明明show已经调用完了,可它里面的代码还可以执行,弹出了3!这就是闭包现象。
闭包简而言之就是:支持在函数内部调用函数之前声明过的变量,比如本例中变量num和那个返回的内部匿名函数。
闭包的原理是作用域链,即变量的作用域在当前函数中,及当前函数内部定义的函数中继续传递,形成了一个链条。
在一般情况下建议避免闭包,每次在用一个变量时,都要先声明再使用。