什么是闭包?
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即便这个函数是在当前词法作用域外执行。
在当前词法作用域内产生的闭包
function fn1(){
var name='fn1';
function fn2(){
console.log(name)
}
fn2()
}
fn1()
在当前词法作用域外产生的闭包——fn1执行上下文已销毁,但fn3仍然能够访问到定义时的词法作用域
function fn1(){
var name='fn1';
function fn2(){
console.log(name)
}
return fn2
}
var fn3 = fn1()
fn3()// 此时才调用fn2,也就是在词法作用域外执行
在当前词法作用域外产生的闭包——将函数作为参数
function fn1(){
var name='fn1';
function fn2(){
console.log(name)
}
fn3(fn2)
}
function fn3(f){
f()//在fn3函数中调用
}
fn1()
总结
在函数定义的时候就产生了词法作用域,在函数被调用的时候可以访问定义时词法作用域内的变量,无论函数是在词法作用域内部还是外部被调用,都产生了闭包。
网友评论