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

来源:2-15 jQuery选择器之特殊选择器this

iceminit

2016-08-19 16:46

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

  • iceminit
    2016-08-26 14:28:11

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

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

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


  • 我学C语言
    2016-08-24 22:00:50

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

    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

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

    qq_给你阳...

    补充: 将num=num+10注释掉后结果不:4,5,21,12 将num=num+10和 第一次出现的this.num+=10;同时注释掉后结果:4,5,11,12

    2016-10-10 11:27:03

    共 2 条回复 >

  • iceminit
    2016-08-19 16:47:57

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

jQuery基础 (一)—样式篇

jQuery初入开启样式修炼,体验万能的jQuery样式集搭建网站布局

217509 学习 · 1218 问题

查看课程

相似问题