var name = "A";
var obj = {
name : "B" ,
getName: function(){
return function(){
return this.name;
}
}
};
alert(obj.getName()()); // A
var a=100;
function f(x){
var a = 10 ;
return function(x){
return (a+= x );
}
}
alert(f()(2)); //12
为什么上面的alert(obj.getName()());,调用的是全局的name, 而后面的alert(f()(2));,调用的却是函数里面 a 的值呢?
还有一个问题:
var a=100;
function f(x){
var a = 10 ;
return function(x){
return (a+= x );
}
}
var x=f();
alert(x(2)); //12
alert(x(2)); //14
var a=100;
function f(x){
var a = 10 ;
return function(x){
var b=a;
return (b+= x );
}
}
var x=f();
alert(x(2)); //12
alert(x(2)); //12
看书上说上面第一段代码里的 a 会驻留在内存里,那么如果将 a 赋值给 b ,最后返回 return (b+= x );那么这个时候 a 会被回收吗?
因为第一段中
return this.name
在被调用时,this
并非指向obj
,而是window
。设
fun = obj.getName
,那么obj.getName()
等效于fun.call(obj)
,实际上在调用时把obj
绑给了this
,所以函数执行时,其this
指向的什么全看函数如何被调用,obj.getName()()
修改为obj.getName().call(obj)
则会输出B
。至于第二段则是由于局部变量作用域的原因,因为函数f的作用域内存在局部变量a。把
return (a += x);
修改为return (this.a += x);
则会输出102
。第二个问题,不会,闭包中始终引用变量
a
。