分享点干货(此this非彼this)this的详细解读
在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的详细解读的更多相关文章
- 如何走上更高平台分享传递干货知识:(开通个人Github面向开源及私有软件项目的托管平台:https://github.com/zlslch/)(图文详解)(博主推荐)
不多说,直接上干货! https://github.com/ 欢迎大家,加入我的微信公众号:大数据躺过的坑 人工智能躺过的坑 同时,大家可以关注我的个人博客: http ...
- 分享原创可复用且非侵入性代码生成工具(for .net)
入行IT十年了,这是本人第一次网上’献丑‘.迫于工作压力,花了大半年时间写了这个生成器以辅助开发.如有价值请多多给予建议,谢谢 好了,废话少说,开动! QA. 1.为什么要用代码生成器? 当然是为了快 ...
- 今日分享一点干货。PHP中课程表的实现。
首先贴代码,代码贴完再细说: 前段HTML: <div id="studentRead" class="reading" style="z-in ...
- iOS社会化分享(干货)
一.苹果原生集成的社会化分享 1.哪些平台 (1)Twitter (2)FaceBook (3)Flickr (4)Vimeo (5)新浪微博 :iOS6 (6)腾讯微博 : iOS7 2.框架 : ...
- uni-app开发经验分享二十: 微信小程序 授权登录 获取详细信息 获取手机号
授权页面 因为微信小程序提供的 权限弹窗 只能通用户确认授权 所以可以 写一个授权页面,让用户点击 来获取用户相关信息 然后再配合后台就可以完成登录 <button class="bt ...
- .net xml 增删改查基础复习及干货分享
今天做做项目时,有一个需求需要用到一些固定的文本数据,觉得将这些需要存储的信息直接写在代码里很不友好,放在数据库中存储又觉得不够方便,自然就想到了使用xml来进行操作,我平常在项目中其实用到xml的机 ...
- 干货: 可视化项目实战经验分享,轻松玩转 Bokeh (建议收藏)
作者 | Will Koehrsen 翻译 | Lemon 译文出品 | Python数据之道 (ID:PyDataRoad) 本文通过一个项目案例,详细的介绍了如何从 Bokeh 基础到构建 Bok ...
- 干货分享:Essay写作收集论据的三个方法
在很多时候,中国留学生写出的Essay在西方学术界看来是存在plagiarism的情况.并不是说咱们写的所有东西都是抄袭,而是思维逻辑和利用证据的方式与西方权威的academic writing不同. ...
- 一文读懂阻塞、非阻塞、同步、异步IO
介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用.select.poll.epoll等这几个词语.在面试的时候也会被经常问到这几个的区别.本文就来讲一下这几个词语的含义.区别以 ...
随机推荐
- UVa 1642 Magical GCD (暴力+数论)
题意:给出一个长度在 100 000 以内的正整数序列,大小不超过 10^ 12.求一个连续子序列,使得在所有的连续子序列中, 它们的GCD值乘以它们的长度最大. 析:暴力枚举右端点,然后在枚举左端点 ...
- STS和Eclipse安装Lombok插件
参考:https://www.cnblogs.com/caozx/p/9510354.html 参考:https://blog.csdn.net/wutian90/article/details/87 ...
- css margin边界叠加问题详谈
问题:给子元素一个margin-top值,其父元素会跟着往下走margin-top的值 一.代码展示 HTML <body> <div class="box"&g ...
- WPF 加载 WINFORM控件 异常: 调度程序进程已挂起,但消息仍在处理中
在加载TradeAtServer的统计中的 单个合约盈亏情况 异常:,调度程序进程已挂起,但消息仍在处理中 发现可能是属性设置引发的问题 比如DateTimePikcer.Value+= set, g ...
- hdu 4704 Sum【组合数学/费马小定理/大数取模】By cellur925
首先,我们珂以抽象出S函数的模型:把n拆成k个正整数,有多少种方案? 答案是C(n-1,k-1). 然后发现我们要求的是一段连续的函数值,仔细思考,并根据组合数的性质,我们珂以发现实际上答案就是在让求 ...
- Headmaster's Headache UVA - 10817
UVA-10817 ans[i][s1][s2]表示考虑前i个人时,有至少1人教的科目集合为s1,有至少2人教的科目集合为s2时的最少工资集合用一个数字表示,转换成二进制后从后面开始数第i位的状态(1 ...
- linux常用的shell命令
1.shell介绍 shell(外壳)是linux系统的最外层,简单的说,它就是用户和操作系统之间的一个命令解释器. 2.shell命名的使用 ls :查看当前目录的信息,list . ...
- Zernike矩之图像重建(附源码)
源码下载 参考: [1] Teague M R. Image analysis via the general theory of moments[J]. JOSA, 1980, 70(8): 920 ...
- double发生精度丢失的解决办法
发生精度丢失的原因: 个人理解:机器在运行时,使用2进制形式的计数方式,而我们日常生活中的计算是10进制的,对于整数的加减乘除,double还能适用,但是对于有小数的,则容易发生精度丢失,即用2进制表 ...
- SqlParameter 操作 image 字段
public static void AddEmployee( string lastName, string firstName, string title, DateTime hireDate, ...