闭包
变量作用域
变量根据作用域的不同分为两种:全局变量和局部变量
- 函数内部可以使用全局变量。
- 函数外部不可以使用局部变量。
- 当函数执行完毕,本作用域内的局部变量会销毁。
什么是闭包
闭包(closure)指有权访问另一个函数作用域中变量的函数。 ————《JavaScript高级程序设计》
简单理解:闭包是一个函数 (一个作用域可以访问另外一个函数内部的局部变量)
例子:一个简单的闭包
//fun这个函数作用域 访问了另外一个函数 fn 里面的局部变量 num
function fn() {
var num = 10;
function fun() {
console.log(num);
}
fun();
}
fn();
闭包的作用
主要作用:延伸了变量的作用范围
函数外面的作用域也可以访问到函数内部的局部变量
例子:
//fn 外面的作用域可以访问fn 内部的局部变量
function fn() {
var num = 10;
function fun() {
console.log(num);
}
return fun;//返回一个函数
}
var f = fn();
//调用f函数 即调用了fn内部的fun函数 fun函数访问了fn的局部变量
f();
//相当于
// var f = function fun() {
// console.log(num);
// }
// return fun;
闭包的应用
经典问题:利用闭包获得当前小li的索引号
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);//传入i
}