当前位置: 首页 > news >正文

javascript中this的用法

this是Javascript语言的一个关键字。

它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。比如,

 

 function test(){

    this.x = 1;

  }

 

随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对象。

下面分四种情况,详细讨论this的用法。

情况一:纯粹的函数调用

这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global。

请看下面这段代码,它的运行结果是1。

  

function test(){

    this.x = 1;

    alert(this.x);

  }

  test(); // 1

 

为了证明this就是全局对象,我对代码做一些改变:

  

var x = 1;

  function test(){

    alert(this.x);

  }

  test(); // 1

 

运行结果还是1。再变一下:

  

var x = 1;

  function test(){

    this.x = 0;

  }

  test();

  alert(x); //0

 

情况二:作为对象方法的调用

函数还可以作为某个对象的方法调用,这时this就指这个上级对象。

  

function test(){

    alert(this.x);

  }

  var o = {};

  o.x = 1;

  o.m = test;

  o.m(); // 1

 

情况三 作为构造函数调用

所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。

  

function test(){

    this.x = 1;

  }

  var o = new test();

  alert(o.x); // 1

 

运行结果为1。为了表明这时this不是全局对象,我对代码做一些改变:

 

 var x = 2;

  function test(){

    this.x = 1;

  }

  var o = new test();

  alert(x); //2

 

运行结果为2,表明全局变量x的值根本没变。

情况四 apply调用

apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是这第一个参数。

 

 var x = 0;

  function test(){

    alert(this.x);

  }

  var o={};

  o.x = 1;

  o.m = test;

  o.m.apply(); //0

 

apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。

如果把最后一行代码修改为

  

o.m.apply(o); //1

 

运行结果就变成了1,证明了这时this代表的是对象o。

(完)

转载于:https://www.cnblogs.com/wangzhenhai/p/6490122.html

相关文章:

  • Foxmail邮件发不出去,都是Mcafee惹得祸
  • 百度编辑器 UEditor setContent()
  • 磨刀不误砍柴工
  • 关于statsd timer的几个指标
  • 独家调查:试解西安深度培训的7个悬疑(中)
  • 使用LVS+keepalived实现mysql负载均衡的实践和总结
  • 关于mysql的论文,大家给点建议
  • 【Scala】Scala之Object
  • jsp+servlet实现文件的上传和下载
  • Swiper使用方法
  • 数据库的索引、视图、触发器、存储过程、游标等概念的理解
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • JVM致命错误日志(hs_err_pid.log)分析(转载)
  • 让服务器可以下载apk和ipa文件
  • 几张图说明男女之间的秘密(ZT)
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【node学习】协程
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • crontab执行失败的多种原因
  • Docker 笔记(2):Dockerfile
  • idea + plantuml 画流程图
  • Laravel5.4 Queues队列学习
  • node和express搭建代理服务器(源码)
  • python3 使用 asyncio 代替线程
  • VUE es6技巧写法(持续更新中~~~)
  • vue学习系列(二)vue-cli
  • Yeoman_Bower_Grunt
  • 构建二叉树进行数值数组的去重及优化
  • 记一次删除Git记录中的大文件的过程
  • 前端代码风格自动化系列(二)之Commitlint
  • 前嗅ForeSpider采集配置界面介绍
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 使用agvtool更改app version/build
  • 数据科学 第 3 章 11 字符串处理
  • 说说我为什么看好Spring Cloud Alibaba
  • # include “ “ 和 # include < >两者的区别
  • #define用法
  • (1)虚拟机的安装与使用,linux系统安装
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (接口自动化)Python3操作MySQL数据库
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ***详解账号泄露:全球约1亿用户已泄露
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .net 4.0发布后不能正常显示图片问题
  • .NET 事件模型教程(二)
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • @JsonFormat与@DateTimeFormat注解的使用
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解