问答详情
源自:2-15 jQuery选择器之特殊选择器this

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


提问者:iceminit 2016-08-19 16:46

个回答

  • 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

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

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

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