闭包指有权访问另一个函数作用域中变量的函数,即一个作用域可以访问另一个函数内部的局部变量。闭包属于高阶函数(高阶函数是对其他函数进行操作的函数,它接收函数作为参数或者将函数作为返回值输出,满足这两个条件中的任何一条都叫做高阶函数)
function fn() { //fn函数就是一个闭包
var num = 10;
return function() { //该匿名函数被返回,调用的时候才执行
console.log(num);
}
}
var f = fn();
f(); //类似于 var f = function () {console.log(num);}
上面代码可以让我们在外面作用域中访问函数fn内部的局部变量(本来全局作用域不可以访问局部作用域中的变量,但局部作用域可以访问全局作用域中的变量),因为函数fn执行完后,发现内部的num变量被另一个函数f调用,所以该局部变量num不会销毁,当函数f执行完后,才会销毁局部变量num。
闭包的作用:延伸了变量的作用范围
闭包运用
1、利用闭包的方式得到当前li的索引号
<ul class = "nav">
<li>11</li>
<li>22</li>
<li>33</li>
</ul>
<body>
<script>
var lis = document.querySelector(".nav").querySelectorAll("li");
for(var i = 0; i < lis.length; i++){
(function(i) {
lis[i].onclick = function() {
console.log(i);
}
})(i)
}
</script>
</body>
2、思考题
var name = "The Window";
var object = {
name: "My Object";
getNameFunc: function() {
return function() {
return this.name;
}
}
}
console.log(object.getNameFunc()()); //The Window
/**
object.getNameFunc()()类似于
var f = object.getNameFunc(); 也就是
var f = function () {return this.name;}
最后f()
立即执行函数中的this指向全局对象window
**/
这段代码中没有产生闭包,因为全局作用域中没有访问到局部作用域中的变量。