为了账号安全,请及时绑定邮箱和手机立即绑定

关于this,不是特别理解,能帮解释下这个执行结果是怎么算出来的

<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>


正在回答

3 回答

有个疑问哈,函数在执行之前不是会进行预解释嘛,带var和function的会进行提前的声明和定义

num=num+10;//此时,num在预解释的时候已经存在了,只是没有赋值,此时的值是undined,那么此处,num=num+10的执行结果应该是NAN吧,

var num=3;此处又给num赋值为3


0 回复 有任何疑惑可以回复我~

我来回答下你的问题,看是否对你有帮助

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

回答的有些繁琐,你将就着看吧!哈哈

3 回复 有任何疑惑可以回复我~
#1

qq_给你阳光般的温暖_03304629

num=num+10;//这里没用var声明,会在全局创建,所以num=21了,这里你还可以把下面fn()和obj.fn()注释掉,这样也可以看出来是全局的 Q1:我把这句给注释掉,结果仍不变,认为全局变量num不是这里加的; Q2:在Q1基础上,把第一个this.num+=10注释掉,运行完fn()后,全局num为11,说明第二个this.num+=10把全局变量num加上了10(而不是把obj.num公有属性加上10); Q3:继续运行obj.fn()后,全局变量num仍然为11?(这里也十分不解) 全局变量num在整个运行状态下值的变化还是不清楚,望指教,谢谢!
2016-10-10 回复 有任何疑惑可以回复我~
#2

qq_给你阳光般的温暖_03304629

补充: 将num=num+10注释掉后结果不:4,5,21,12 将num=num+10和 第一次出现的this.num+=10;同时注释掉后结果:4,5,11,12
2016-10-10 回复 有任何疑惑可以回复我~

答案分别是,4 ,5, 21 , 12

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

关于this,不是特别理解,能帮解释下这个执行结果是怎么算出来的

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信