如何产生闭包?
当一个嵌套的内部函数引用了嵌套的外部函数的变量时,就产生了闭包。
闭包到底是什么?
使用谷歌浏览器调试查看
理解一:闭包就是嵌套的内部函数。
理解二:内部函数中包含被引用变量的对象。
产生闭包的条件:
1.函数嵌套
2.内部函数引用了外部函数的数据(变量/函数)
注意:满足上述条件的函数,内部函数在声明的时候就产生了闭包。
但一定要调用外部函数。
外部函数执行了几次就会创建几次内部函数。
常见的闭包的两种情况
1. 将函数作为另一个函数的返回值
function f1(){
var b=2;
function fn(){
b++;
console.log(b);
}
return fn;
};
var f=f1();
f();
f();
在这个例子中我们创建了一个变量f并把fn函数的执行结果(fn)赋值给f
然后调用了两次f,结果打印输出了3和4.
有些人可能就问了。为什么时3和4呢,b不是函数内部的变量吗,执行函数完后就自动释放了啊,这是因为在这个 过程中产生了一个闭包,查看上边闭包产看产生闭包的条件可知,在f1函数的内部嵌套了一个fn函数,并且fn函数引用了f1中 的数据b,我们在上边说了内部函数在声明的时候就产生了闭包,而这整个过程中内部函数只声明创建了一次,所以就只产生了一个闭包,而下边的调用的两个f只是在执行fn函数,
要想产生多个闭包怎么做呢,我们上边也说啦:外部函数执行了几次就会创建几次内部函数。
2.将函数作为实参传递给一个函数调用
function show(msg,time) {
setTimeout(
function(){
alert(msg)
},time )
}
show("nihao",1000)
这个例子中产生闭包的原因也挺明显的,首先存在函数嵌套,其次内部函数引用了外部函数的变量msg