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

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

0 137

问题如下:

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

  • 加入年费大会员(20每年)
  • 热门标签

    猜你喜欢

    1. git commit -m与-am的区别
    2. 全球化流程中原型设计的加分项
    3. [Paxos] Paxos Made Simple 读后感
    4. 数据结构看书笔记(四)--栈与队列
    5. XML.01-语法简介
    6. UE4中的单映射:TMap容器
    7. 使用UIBezierPath绘制图形
    8. Git学习之路(6)- 分支操作
    9. 一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表
    10. Win10下 VS2017 安装失败 未能安装包“Microsoft.VisualStudio.AspNet45.Feature,version=15.0.26208.0”

    衣食父母

    最近热帖

    1. python自动化开发-[第一天]-基础数据类型与编码 4
    2. 从装箱拆箱看泛型 4
    3. 把上传Github的代码添加Cocoapods支持 6
    4. 使用jquery的load方法设计动态加载,并解决浏览器前进、后退、刷新等问题 6
    5. 远程SSH连接服务与基本排错 6
    6. APP反编译第一课《如何找到核心代码》 7
    7. Akka(1):Actor - 靠消息驱动的运算器 6
    8. nginx源码分析——event模块 7
    9. ashMap源码阅读与解析 7
    10. 【响应式】foundation栅格布局的“尝鲜”与“填坑” 7

    随机文章

    1. 计算机程序的思维逻辑 (51) - 剖析EnumSet
    2. C#创建带命名空间、前缀、Soap格式的XML(下)
    3. QCustomplot使用分享(二) 源码解读
    4. iOS 之 退出app(项目)的几种方法
    5. Android 四大组件之再论BroadCast