第一组、外部引用再执行
[mw_shl_code=javascript,true]var m, n;//全局变量
function outer_a1() {
var num = 10;
function inner() {
console.log(num) //打印了outer_a1中定义的num
debugger
}
m = inner;
}
outer_a1();
m();
function outer_a2() {
var num = 10;
function inner() {
console.log("just console") //只做了简单的打印
debugger
}
n = inner;
}
outer_a2();
n();
[/mw_shl_code]
上面两张图片是分别执行outer_a1()和outer_a2()后再执行m()和n()时,到其中的debugger断点后,chrome控制台的截图,我们可以看出第一个出现了Closure并包含了变量num:10,第二张图并没有出现Closure。先不做解释,继续第二组案例对比。 第二组、内部直接执行
[mw_shl_code=javascript,true]function outer_b1() {
var num = 15;
function inner() {
console.log(num) //打印了outer_b1中定义的num
debugger
}
inner()
}
outer_b1();
function outer_b2() {
var num = 15;
function inner() {
console.log("just console") //只做了简单的打印
debugger
}
inner()
}
outer_b2();
[/mw_shl_code]
第二组跟第一组差不多,只是改为了在outer_b1和outer_b2中直接执行了inner,我们可以发现还是第一个产生了Closure包含变量num:15(备注:如果把var num = 15;放在inner()执行的后面,根据变量提升规则,Closure中的变量num值就是undefined),第二个并没有产生Closure,继续第三组: 第三组、return后再执行
[mw_shl_code=javascript,true]function outer_c1(s) {
var num = 20;
function inner() {
console.log(s + num) //打印包含了outer_c1形参s和定义的num
debugger
}
return inner
}
outer_c1()();
function outer_c2(s) {
var num = 20;
function inner() {
console.log("just console") //只做了简单的打印
debugger
}
return inner
}
outer_c2()();
[/mw_shl_code]
第三组使用了return把内部的inner返回出来,然后分别执行outer_c1()()和outer_c2()()来运行内部的inner,发现还是第一个产生了Closure而第二个没有Closure,不同的是第一个又引用了outer_c1的形参s,所以Closure中的变量也多了一个s,不过执行outer_c1()时并没有传入实参,所以s的值是undefined。再来看下最后一组吧: 第四组、多种方式一起
[mw_shl_code=javascript,true]var x, y, z; //全局变量
function outer_d1(s) {
var num = 25;
function inner1() {
console.log(num) //打印定义的num
debugger
}
x = inner1;
function inner2() {
console.log("just console") //只做了简单的打印
debugger
}
inner2();
function inner3() {
console.log(num) //打印定义的num
debugger
}
return inner3
}
outer_d1("i am x")();
x();
function outer_d2(s) {
var num = 25;
function inner1() {
console.log(s) //打印outer_d2的形参s
debugger
}
y = inner1;
function inner2() {
console.log("just console") //只做了简单的打印
debugger
}
inner2();
function inner3() {
console.log(num) //打印定义的num
debugger
}
return inner3
}
outer_d2("i am y")();
y();
function outer_d3(s) {
var num = 30;
function inner1() {
console.log("just console") //只做了简单的打印
debugger
}
z = inner1;
function inner2() {
console.log("just console") //只做了简单的打印
debugger
}
inner2();
function inner3() {
console.log("just console") //只做了简单的打印
debugger
}
return inner3
}
outer_d3("i am z")();
z();
[/mw_shl_code]
最后一组对比了三个例子就不上截图了,就是上面三组一起上,大家可以自己运行下,结果会发现: