在javascript编程中,this关键字经常让初学者感到迷惑,这里,针对此this根据查阅的资料和个人的理解分享一下,纯手打,大神勿喷。

首先先说一下this的指向,大致可以分为以下四种。

1.作为对象的方法调用。

2.作为普通函数调用。

3.构造器调用。

4.Function.prototype.call或者是Function.prototype.apply调用。

这四种调用很重要,如果能彻底理解了,应该不会再对这个this感到迷惑了。

1.作为对象的方法调用

         var obj = {
value: 1,
getValue: function() {
console.log(this === obj);//输出 true
console.log(this.value); //输出 1
}
};
obj.getValue();

2.作为普通函数调用

当函数不作为对象的属性被调用时,也就是普通的函数调用方式,通常来讲,this是指向全局对象的,在浏览器里,也就是window对象。

         window.name = "michael";
var obj = {
name:"tom",
getName:function() {
return this.name;
}
};
var getName = obj.getName;
console.log(getName()); //输出 michael

3.构造器调用

除了宿主提供的一些内置函数,大部分的javascript函数可以当构造器来使用,它和普通函数的区别在于被调用的方式。当使用new来调用的时候,通常是返回一个对象,构造器里的this就指向这个返回的对象。

         var myClass = function(){
this.name = "michael";
};
var obj = new myClass();
console.log(obj.name);// 输出michael

但是,使用new调用的时候,还需要注意这样一个问题,如果构造器显式返回一个object类型的对象的时候,那么这次最终返回的是这个对象,而不是this.

         var myClass = function(){
this.name = "michael";
return {//显式返回一个对象
name:"tom"
};
};
var obj = new myClass();
console.log(obj.name);// 输出tom

上述情况需要特殊注意.

4.Function.prototype.call或者是Function.prototype.apply调用

与第二种普通函数调用相比,call或者apply可以动态改变this的指向,听着蛮高大上的。

         var obj = {
name:"michael",
getName:function() {
return this.name;
}
};
var obj2 = {
name:"tom"
};
console.log(obj.getName()); //输出 michael
console.log(obj.getName.call(obj2)); //输出 tom

通过代码分析来看,显然this的指向已经人为的改变了。

以上就是关于this的一点小小的分享。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

分享点干货(此this非彼this)this的详细解读的更多相关文章

  1. 如何走上更高平台分享传递干货知识:(开通个人Github面向开源及私有软件项目的托管平台:https://github.com/zlslch/)(图文详解)(博主推荐)

    不多说,直接上干货! https://github.com/ 欢迎大家,加入我的微信公众号:大数据躺过的坑        人工智能躺过的坑       同时,大家可以关注我的个人博客:    http ...

  2. 分享原创可复用且非侵入性代码生成工具(for .net)

    入行IT十年了,这是本人第一次网上’献丑‘.迫于工作压力,花了大半年时间写了这个生成器以辅助开发.如有价值请多多给予建议,谢谢 好了,废话少说,开动! QA. 1.为什么要用代码生成器? 当然是为了快 ...

  3. 今日分享一点干货。PHP中课程表的实现。

    首先贴代码,代码贴完再细说: 前段HTML: <div id="studentRead" class="reading" style="z-in ...

  4. iOS社会化分享(干货)

    一.苹果原生集成的社会化分享 1.哪些平台 (1)Twitter (2)FaceBook (3)Flickr (4)Vimeo (5)新浪微博  :iOS6 (6)腾讯微博 : iOS7 2.框架 : ...

  5. uni-app开发经验分享二十: 微信小程序 授权登录 获取详细信息 获取手机号

    授权页面 因为微信小程序提供的 权限弹窗 只能通用户确认授权 所以可以 写一个授权页面,让用户点击 来获取用户相关信息 然后再配合后台就可以完成登录 <button class="bt ...

  6. .net xml 增删改查基础复习及干货分享

    今天做做项目时,有一个需求需要用到一些固定的文本数据,觉得将这些需要存储的信息直接写在代码里很不友好,放在数据库中存储又觉得不够方便,自然就想到了使用xml来进行操作,我平常在项目中其实用到xml的机 ...

  7. 干货: 可视化项目实战经验分享,轻松玩转 Bokeh (建议收藏)

    作者 | Will Koehrsen 翻译 | Lemon 译文出品 | Python数据之道 (ID:PyDataRoad) 本文通过一个项目案例,详细的介绍了如何从 Bokeh 基础到构建 Bok ...

  8. 干货分享:Essay写作收集论据的三个方法

    在很多时候,中国留学生写出的Essay在西方学术界看来是存在plagiarism的情况.并不是说咱们写的所有东西都是抄袭,而是思维逻辑和利用证据的方式与西方权威的academic writing不同. ...

  9. 一文读懂阻塞、非阻塞、同步、异步IO

    介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用.select.poll.epoll等这几个词语.在面试的时候也会被经常问到这几个的区别.本文就来讲一下这几个词语的含义.区别以 ...

随机推荐

  1. 2016 Multi-University Training Contest 1Abandoned country

    qaq,现在内心真是各种草泥马.怪自己见识短浅...哎... 题意: 给你一幅图,然后求一个最小花费使得所有的点都连通(这就是最小生成树啊),然后在这棵树上[如果我要从任意起点到任意终点,这两个点不同 ...

  2. 第六篇 .NET高级技术之拆箱装箱

    拆箱.装箱 值类型赋值给Object类型变量的时候,会发生装箱:包装成Object.ValueType不也是继承自Object吗(CLR内部处理): Object类型变量赋值给值类型赋值的时候会发生拆 ...

  3. Docker部署Tomcat,Nginx,Redis应用

    一.tomcat部署 1.拉取tomcat镜像 docker pull tomcat:7-jre7 2创建tomcat容器 创建容器用于部署单点登录系统(CAS)  -p表示地址映射 docker r ...

  4. MVC 下 ajax调用 日期差值计算

    背景: 服务项目已有服务期起止时间From-To 现在要根据用户输入的新的起始时间, 和该服务期的原有区间值, 计算出新的服务期截止时间 即 NewServiceToDateTime = NewSer ...

  5. Asp.net 字符(一)

    1.字母大小写处理 private string GetChangedStr(string oldStr, strType type) { string newStr = ""; ...

  6. Angular JS中变量定义的基本原则

    在Angular JS开发中,经常需要定义一些变量,关于这些变量的定义方法及作用域应该注意以下几点: 1. 如果能用局部变量解决问题,尽量不要用全局变量. 2. 需要与界面双向绑定的变量采用$scop ...

  7. 解决异常System.Runtime.Interopservices.COMException RequestLock问题

    工具——导入导出设置,重置调试设置就可以了,这是调试文件的异常

  8. Android(java)学习笔记184:多媒体之 MediaPlayer使用

    MediaPlayer类可用于控制音频/视频文件或流的播放.关于如何使用这个类的方法还可以阅读VideoView类的文档. 1.MediaPlayer 状态图       对播放音频/视频文件和流的控 ...

  9. 数据库管理系统X

    大部分DBMS提供数据定义语言DDL(Data Definition Language)和数据操作语言DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约 ...

  10. springBoot + KISSO实现单点登录

    1:创建一个maven项目 kisso,然后再创建二个子项目都是springboot 2:二个boot项目的pom.xml都是一样的 就这三个依赖,3:接下来就是码代码了,首先在(在我这里)sprin ...