首页 > 代码库 > 关于js中this指向的问题,打印出obj.nm()的值

关于js中this指向的问题,打印出obj.nm()的值

问题如下:

var num = 1;
var obj={
  num : 8,
  nm   : (function(){
        this.num *=2;
        return function(){
          return this.num *=2;
        }
     })()
}
var dbl = obj.nm;
obj.nm();
obj.nm();
obj.nm();
console.log(obj.num);//64
console.log(this.num);//2

解释:

上述问题中其实就是this的指向问题,this指向明白了自然就清楚了!

首先看第一句:

//这句是声明了一个全局变量num=1;(这里没什么解释的,如果这都不明白就去从js基础学习吧)

var num = 1;

//接下来以字面量的方式创建了一个对象obj,包含两个键值对;
var obj={

  //num,obj的共有属性,值为8;
  num : 8,

  //nm的值是一个闭包函数(自执行函数);
  nm   : (function(){

        //这里是重点了!!!不管执行或者不执行obj.nm()闭包函数都是执行的,并不是obj.nm()调用的,因此这里的this指的是window;

        console.log(this);//window
        this.num *=2;

        //当执行obj.nm()时,会将下面这个函数返回给obj,也就是说里面的函数中的this才是指向obj的,可以说是谁调用的函数,this就指向谁,因此这里的this指向obj;
        return function(){

          console.log(this);//obj
          return this.num *=2;
        }
     })()
}

//这里是用来骗人的!执行或者不执行,window.num = 2,obj.num=8;(闭包函数自己调用了一次,所以开始定义的全局num*2=2;)
var dbl = obj.nm;

//执行下面后,nm的值也就是闭包函数中的return的函数被执行了,因为闭包函数是自执行函数,obj.num()没资格调用它,调用的是返回给obj.num()的函数;

//执行后window.num=2;(obj.num()调用的是obj.num),obj.num=16;
obj.nm();

//同理,下面的obj.num()都是执行的obj.num*2;此时window.num = 2;obj.num = 32;
obj.nm();

//window.num = 2;obj.num = 64;
obj.nm();

//此时输出结果,结果必然为window.num = 2,obj.num = 64;
console.log(obj.num);//64
console.log(this.num);//2,这里的this指的是window

关于js中this指向的问题,打印出obj.nm()的值