<script type="text/javascript">
var num=1;
var obj={
num:2,
fn:(function(){
this.num+=10;
num=num+10;
var num=3;
return function(){
this.num+=10;
num++;
console.log(num);
}
})()
}
var fn=obj.fn;
fn();
obj.fn();
console.log(num);
console.log(obj.num);
</script>
有个疑问哈,函数在执行之前不是会进行预解释嘛,带var和function的会进行提前的声明和定义
num=num+10;//此时,num在预解释的时候已经存在了,只是没有赋值,此时的值是undined,那么此处,num=num+10的执行结果应该是NAN吧,
var num=3;此处又给num赋值为3
我来回答下你的问题,看是否对你有帮助
var num=1;//全局作用域的num
var obj={
num:2,//对象obj中的num,(公有属性)
fn:(function(){
this.num+=10;//因为这是一个自调函数,所以this就是window,等于是window.num+=10;所以走到这一步全局num=11,实在不清楚this指的是哪个对象你就打印输出一下this,这样就可以看出来了
//alert(this);
num=num+10;//这里没用var声明,会在全局创建,所以num=21了,这里你还可以把下面fn()和obj.fn()注释掉,这样也可以看出来是全局的
var num=3;//obj对象fn方法中的闭包中的num,(私有属性)
return function(){//这里形成闭包,受保护的变量是num=3
this.num+=10;//由于返回给obj.fn是这整个函数,这里的this就是.前面的对象,也就是obj,所以obj对象中的num在这里会变成12
//console.log(this);
num++;//这里就是操作闭包中的num了,只要执行obj.fn就会把受保护的变量num变成+1
console.log(num);//打印输出obj.fn中的num,所以下面你也可以看到前面两个直接调用函数就可以出结果
}
})()//自调
}
var fn=obj.fn;//把obj.fn赋值给fn
fn();//这里执行的程序是obj对象fn方法
obj.fn();//这里也是执行obj对象fn方法,(障眼法)
console.log(num);//这里输出的是全局的num
console.log(obj.num);//这里输出的是obj对象中的num
回答的有些繁琐,你将就着看吧!哈哈
答案分别是,4 ,5, 21 , 12