要想知道闭包是什么?
首先我们要知道匿名函数和自运行.
匿名函数:顾名思义就是没有名字的函数,当某个函数 function 关键字没有标识符的时候 就是匿名函数.
匿名函数常见的用法:
* 函数表达式(var test = function(){})
* 事件处理函数 (window.onload = funciont(){})
* 自运行(立即执行)
* 闭包里的返回值
而自运行呢?
自运行就是 能够自己运行的一个函数.字面意思就是不用别人调用就能够自己运行的函数,这是学习闭包的基础.
学习了基础 ,接下来我们就了解一下什么是闭包吧.
官方解释:
闭包 就是一个拥有很多变量 和绑定这些变量的还击的表达式 通常是一个函数, 这些变量也就是表达式的一部分.
JavaScript中所有的function都是一个闭包。不过一般来说,嵌套的function所产生的闭包更为强大,也是大部分时候我们所谓的“闭包”。
是不是看到这仍然不知道是个啥,哈哈哈和我当初一样.
其实通俗点来说:
闭包是指有权访问另外一个函数作用域中的变量的函数.可以理解为(能够读取其他函数内部变量的函数)--这是重点哦!
闭包有什么作用呢?
正常函数执行完毕后,里面声明的变量被垃圾回收处理掉,但是闭包可以让作用域里的 变量,在函数执行完之后依旧保持没有被垃圾回收处理掉
* 可以读取函数内部的变量
* 让这些变量的值始终保持在内存中。
* 增加块级作用域
使用闭包应该注意哪些呢?
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。
闭包会在父函数外部改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
话不多说 ,上个案例吧,带你更清晰的了解闭包.
* 示例:事件绑定
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<ul>
<li>1111</li>
<li>2222</li>
<li>3333</li>
<li>4444</li>
<li>5555</li>
</ul>
</head>
<body>
</body>
</html>
<script>
let list = document.getElementsByTagName("li");
for(var i=0; i<list.length; i++){
//list[i].index = i;
(function fun(i){//自运行
list[i].onclick = function(){
//alert(this.index+1);
alert(i);
}
}(i));
}
</script>
* 用闭包的方式实现mult(5)(6)(7),表示三个数的乘法(5*6*7)
function fun(m){
return function(n){
return function(k){
return m*n*k;
};
}
}
console.log(fun(5)(6)(7));