全部 android asp.net C/C++ cshap IOS Java javascript nodejs perl php python ruby web容器 其他 前端 数据库 第三方平台 混合式APP 网络 系统 默认分类

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

0 122

问题如下:

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);//64console.log(this.num);//2,这里的this指的是window

热忱回答0