在《你所不知道的javaScript》中闭包的定义:
闭包是指有权访问另一个函数作用域中变量的函数。
我理解的:
预先定义一个环境,使得表达式中的每一个自由变量都得到了一个绑定值,开放表达式变成了一个闭合表达式,构建了一个闭包。
进一步:
闭包=函数+使得函数中每一个自由变量都获得绑定值的一个环境。
函数是包含自由变量的函数,环境是使所有自由变量都获得绑定值的环境。
所以得出闭包就是:函数和对其周围状态(词法环境)的引用捆绑在一起构成闭包。
(function fout(){
const a=1;
function fin(){
Console.log(a);
}
return fin;
})()()
//1.
这里fin函数可以访问外部fout函数的变量,这里就构成一个闭包,所以最后输出为1。被访问的函数fout()就是一个闭包函数。
function fout(){
let a=1;
function fin(){
console.log(a++)
}
return fin;
}
const fa = fout();
const fb = fout();
fa();
fb();
fa();
fb();
//输出1 1 2 2
这里也是和上面一样的道理。这里fout()也是一个闭包函数。
总结:
1.函数和对其周围状态(词法环境)的引用捆绑在一起构成闭包。
2.也就是说,闭包可以让你从内部函数访问外部函数作用域。
3.在JavaScript中,每当函数被创建,就会在函数生成时生成闭包。
闭包的主要作用:延伸了变量的作用范围。
闭包的缺点:会浪费内存,造成内存泄漏。
闭包的案例
点击获取li的索引
(1)动态添加属性方式
<body>
<div>
<ul class="nav">
<li>苹果</li>
<li>香蕉</li>
<li>芒果</li>
</ul>
</div>
<!-- 动态添加属性方式 -->
<script>
var lis = document.querySelector(".nav").querySelectorAll('li');
for(var i=0;i<lis.length;i++){
lis[i].index = i;
lis[i].onclick = function(){
console.log(this.index);
}
}
</script>
</body>
(2)闭包方式
<body>
<div>
<ul class="nav">
<li>苹果</li>
<li>香蕉</li>
<li>芒果</li>
</ul>
</div>
<!-- 闭包属性方式 -->
<script>
var lis = document.querySelector(".nav").querySelectorAll('li');
for(var i=0;i<lis.length;i++){
// 利用for循环创建立即执行函数
(function(i){
lis[i].onclick = function(){
console.log(i);
}
})(i)
}
</script>
</body>
以上就是闭包的一个概念和应用。
终于尝试写博客了,踏出了第一步!!
希望翻身啊!