第一部分
案例一
var num=1;
function f(){
return function(){
num++;
console.log(num);
};
}
var c=f();
c();
c();
var d=f();
d();
d();
console.log(c===d);
结果是:
console:
2
3
4
5
false
案例二
function f(){
var num=1;
return function(){
num++;
console.log(num);
};
}
var c=f();
c();
c();
var d=f();
d();
d();
console.log(c===d);
结果是:
Console
2
3
2
3
false
案例三
function f(){
return function(){
var num=1;
num++;
console.log(num);
};
}
var c=f();
c();
c();
var d=f();
d();
d();
console.log(c===d);
结果:
console
2
2
2
2
false
第二部分
案例一
var num={a:1};
function f(){
return function(){
num.a=2;
return num;
};
}
var c=f()();
console.log(c);
var d=f()();
console.log(d);
c.a=5;
console.log(c);
console.log(d);
console.log(c===d);
结果:
console
[object Object] {
a: 2
}
[object Object] {
a: 2
}
[object Object] {
a: 5
}
[object Object] {
a: 5
}
true
案例二
function f(){
var num={a:1};
return function(){
num.a=2;
return num;
};
}
var c=f()();
console.log(c);
var d=f()();
console.log(d);
c.a=5;
console.log(c);
console.log(d);
console.log(c===d);
结果:
console
[object Object] {
a: 2
}
[object Object] {
a: 2
}
[object Object] {
a: 5
}
[object Object] {
a: 2
}
false
案例三
function f(){
return function(){
var num={a:1};
num.a=2;
return num;
};
}
var c=f()();
console.log(c);
var d=f()();
console.log(d);
c.a=5;
console.log(c);
console.log(d);
console.log(c===d);
结果:
console
[object Object] {
a: 2
}
[object Object] {
a: 2
}
[object Object] {
a: 5
}
[object Object] {
a: 2
}
false
请留意console.log的值。
请留意在第一部分我只是改变了var num=1出现的位置以造成不同的闭包情况,同样第二部分我只是改变了var
num={a:1}出现的位置以造成不同情况的闭包。到底什么情况下c和d才会是===? c和d相等实际是什么?词法环境还是什么相等?
各个console值出现的原因? 请具体些分析,不妨从js代码解析、闭包等深层次的原因分析
等你来挑战!!!
回答下第一部分,其余部分道理一样。
知识点: 变量作用域 作用域链 引用类型
案例一:num属于全局变量,所有的num变量均是这一个值。所以每次num++,便会修改num的值。至于c === d 这是两个不同的函数,所在内存的引用不同自然也就是false。
案例二: num放在了函数内部,函数返回的匿名函数便形成了闭包,上面提过c 与 d 代表的是两个不同的函数,各自有各自的num变量,当外部函数f()执行完毕后,由于内部闭包的存在,该变量并不会被释放。所以num会被累加。
案例三: num处于f()返回的匿名函数内部,没有产生闭包,该函数调用完毕后会被释放。