简单谈谈JavaScript中的this
是夜,想着考量下小黄毛近期的JavaScript进阶如何了,鉴于近期一直在接触Vue 2.0,索性就围绕this编写了个代码片段,
给其一个测量,毕竟写js的程序员都知道,JavaScript的函数调用时会隐性的接收到两个附加的参数:this和arguments。
1、先上代码:
/**
* this
*/
var ajaxThis = (function() {
global.a = 2;
function fn(b) {
this.b = b;
console.log(this.a);
}
var obj = {
a : 4,
fn : fn
};
fn();// 题1
obj.fn(); // 题2
fn.call(obj); // 题3
fn.call(null);// 题4
fn.apply(obj);// 题5
fn.apply(null);// 题6
var fnInstance = new fn(8);
console.log(fnInstance.b);// 题7
})();
注:这些题倒不难,只要你把握好JavaScript中的this到底指向谁,那么就问题不大。
2、小测验答案
题1:2
题2:4
题3:4
题4:2
题5:4
题6:2
题7:undefined
8
不要好奇,第7题的确是输出两个值
先说些闲话,当你对JavaScript接触使用的多了,就能感受到它的方面之处,同时也能够避开它的缺点,发扬其优点。
在解析答案之前,先来讲解一下到底如何判断this的取值吧。
其实,this的值取决于调用的模式。
调用模式?那都有哪些调用模式呢?
总的来说,JavaScript的函数调用总共有4种模式,是的,你没听错,就是4种!!!
哪4种?
• 方法调用模式
• 普通函数调用模式
• 构造器调用模式
• apply/call调用模式
而针对这四种调用模式,参数this的取值会有所差异:
• 方法调用模式
何为方法调用?当然泛指针对对象来说的了。该种调用模式说明,函数在某个明确的上下文对象中调用时,this绑定的是这个上下文对象。
e g. 题2的 obj.fn(); // 调用的对象是obj,所以this绑定的就是obj,所以fn()内部console.log(this.a)输出的便是obj.a,即为4
• 普通函数调用模式
普通函数调用?指的便是直接调用函数。这种调用模式,默认情况下,如果函数是被直接调用的,则this绑定到全局对象;
如果在严格模式下(即 'use strict'),就绑定到undefined。
e g. 题1中的 fn(); // 因为没有指明调用方,同时又是非严格模式,所以,fn()函数内部的this绑定到全局对象,所以this.a的值为global.a,即为2
• 构造器调用模式
构造器调用模式?这个应该都不陌生吧?!当然指的是通过new操作符来调用的函数啦!在这里有点类似于面向对象编程的概念,构造器函数内部的this当然
绑定到这个新创建的对象了。这种调用模式,指的便是:如果函数通过new操作符调用,this绑定的是新创建的对象。
e g. 题7中的 var fnInstance = new fn(8); // 因为是通过new操作符调用的fn函数,所以this指向当前新创建的对象,然而这个对象没有a这个属性,所以输出undefined
console.log(fnInstance.b); // 然而因为给fn函数传入了值8,所以……
• apply/call调用模式
apply/call又是什么鬼?我先来解说它们的用法吧!
a) apply()和call()方法的第一个参数都是要调用函数的对象。用apply()和call()调用函数时,函数内的this属性总是引用这个参数;
b) call()函数剩余参数是传递给要调用的函数的值,它们的数量可以是任意的;
c) apply()方法和call()方法类似,只不过它只接收两个参数,除了调用者之外,它的第二个参数是一个带下标的集合(比如数组,但也可以不是数据),
apply()方法把这个集合中的元素作为参数传递给调用的函数。
OK,现在重新回到主题:该种调用模式,this又指的是谁?细心的你可能已经注意到,上面介绍他们的用法是,已经提到函数内的this属性总是引用第一个参数,
也就是调用函数的对象。也就是说,函数通过apply/call调用,this绑定的是指定的对象,然而,如果把null/undefined作为this的绑定对象传入apply/call,
在调用时会被忽略,实际应用的是默认绑定规则。
e g. fn.call(obj); // 题3,答案为console.log(obj.a),即为4
fn.call(null);// 题4 ,因为null被忽略,答案为console.log(global.a),即为2
fn.apply(obj);// 题5 ,答案为console.log(obj.a),即为4
fn.apply(null);// 题6 ,因为null被忽略,答案为console.log(global.a),即为2
好了,就总结到这里。小黄毛,你懂了吗?
简单谈谈JavaScript中的this的更多相关文章
- 谈谈javascript中的prototype与继承
谈谈javascript中的prototype与继承 今天想谈谈javascript中的prototype. 通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性 ...
- 简单谈谈Python中的几种常见的数据类型
简单谈谈Python中的几种常见的数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等 ...
- 简单分析JavaScript中的面向对象
初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...
- 谈谈javascript 中的函数问题
聊聊javascript中的函数 本文可作为李刚<疯狂htmlcssjavas讲义>的学习笔记 先说一个题外话 前几天在知乎上流传着一个对联 上联是雷锋推到雷峰塔 nnd 这是什么对联? ...
- 简单说 JavaScript中的tostring( ) 与 valueOf( )方法
说明 所有的对象都继承有toString() 和 valueOf() 方法,对象到字符串,对象到数字的转换,会通过调用待转换对象的这两个方法中的一个来完成. 解释 toString( )方法的作用是: ...
- 谈谈javascript中的日期Date对象
一.日期对象 在javascript中并没有日期型的数据类型,但是提供了一个日期对象可以操作日期和时间. 日期对象的创建: new Date();二.将日期对象转换为字符串 将日期对象转换为字 ...
- 谈谈 JavaScript 中的 this 指向问题
JavaScript 中的 this 为一个重难点,它不像静态语言 C#.Java 一样,就表示当前对象.而在 JS 中, this 是运行时确定,而并非定义时就已确定其值. 谈起 this ,必须少 ...
- 简单理解Javascript中的call 和 apply
javascript中面向对像的能力是后来加进来的, 为了兼容性, 所以整出了很多奇特的东西, function Animal(){ this.name = "Animal"; t ...
- 简单理解javascript中的原型对象,实现对之间共享属性和行为
javascript中提供了构造函数.可以方便的创建对象. 典型的构造函数例如以下: function Person(name, age) { this.name = name; this.age = ...
随机推荐
- iOS透明引导页
一.效果展示 这里写图片描述 这种类型的新手引导比较常见,用于告诉用户某个按钮的作用,或者提醒用户可以进行某种交互操作.引导样式是在界面上加了一个半透明的引导图,高亮部分就是要突出的区域 二.怎么做? ...
- HTML表格边框的设置小技巧-表格
对于很多初学HTML的人来说,表格<table>是最常用的标签了,但对于表格边框的控制,很多初学者却不甚其解. 一般我们用表格的时候总会给它个border属性,比如:<table b ...
- mysql优化------2 查看系统性能(表大小,I/o性能)
三:判断mysql I/0 性能的一种方式(网络搜集供参考) show global status like 'innodb_dblwr%'\G 如果innodb_dblwr_pages_writ ...
- KERMIT,XMODEM,YMODEM,ZMODEM传输协议小结(转)
源:KERMIT,XMODEM,YMODEM,ZMODEM传输协议小结 Kermit协议 报文格式: 1.MARK,起始标记START_CHAR,为 0x01(CTRIL-A): 2.LEN,报文剩余 ...
- java系列--EL和JSTL
一.EL表达式语言 构成:${变量} 功能:可以从范围对象直接取值 默认为requestScope 如果访问的属性不存在,EL返回值为null,但在JSP页面中显示空字符串不显示 EL表达式可以出现的 ...
- java系列--集合
==比较地址,equals比较内容 一.常用集合框架: 1.List结构集合类:ArrayList类: LinkedList类:addFirst( ),addLast( ),remove( ), Ve ...
- 创业类网站建设日志1——搭建服务器svn以及前端开发环境
1.需要在linux环境的服务器下搭建node和npm还有Grunt,所以先需要一个叫putty的工具连接服务器命令行终端 2.双击putty工具,在HostName一栏输入项目服务器地址:172.1 ...
- python 自动化之路 day 13
本节内容参考博客: http://www.cnblogs.com/wupeiqi/articles/5132791.html http://www.cnblogs.com/wupeiqi/articl ...
- Angular - - ngCsp、ngFocus、ngBlur、ngForm
ngCsp 处理CSP(上下文安全策略)的支持. 当开发如google浏览器的扩展时候这个就必须使用. CSP禁止应用程序使用eval和Function(string)生成的函数.如果我们需要兼容,我 ...
- 2.14. 删除托管对象(Core Data 应用程序实践指南)
删除托管对象,只要调用托管对象上下文的deleteObject 或 deleteObjects就可以了.同样,真正的删除,要在调用save:之后.