1.什么是闭包
闭包是是指有权访问另一个函数作用域中变量的函数,创建闭包的常见方式就是在一个函数内部创建另一个函数。
2.闭包的作用
>事件点击回调函数使用
btn.addEventListener("click",function(e){
console.log(e)
})
>定时器回调函数
var msg = "倒计时结束"
setTimeout(function(){
console.log(msg)
},1000)
>函数内部变量生命
function sun (a,b){
var sum;
var func = function(){
sum=a+b
}
}
>函数参数的形式
function sum(a,b,func){
return func(a,b)
}
>立即执行函数(也称创建私有变量)
(function(){
var title = "首页"
function rotate(){
}
})()
全局环境访问不了立即执行函数中的变量
>在循环中使用闭包
for(var i =0;i<10;i++){
(function(i){
setTimeout(function(){
console.log(i);
},500*i);
})(i);
}
3.闭包形成的原因
闭包之所以能够访问外部函数变量是因为作用域链的访问规则是下层作用域可以访问上层作用域 ,但是上层作用域不可以访问下层作用域变量
函数执行的时候会创建函数的执行上下文及相应的作用域链,并推入栈中。然后使用arguments和其他命名参数的值来初始化函数的活动对象,但在作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三层,...直至全局作用域。
举个例子:
var num = 1
function example(){
var sum = 0
return function(){//闭包函数
sum+=num
console.log(sum,num)
}
}
var result =example()
result()
上述例子中,在执行example()返回的时闭包函数时,当result()执行的时候,首先创建了当前活动对象(this对象,arguments),上层example函数的活动对象(this对象,arguments,变量sum),全局活动对象(this对象,arguments,变量num)。上述例子的作用域链关系如下图:
3.闭包的弊端
由于闭包包含外层函数的引用,所占用内存空间就大,查找变量的时候多一层作用域就多一层查找,查找速度就会变慢,性能会变差。