“茴”字有四种写法,this也是一样
说到这个地方又想起以前高中还是初中学的《孔乙己》这个梗,但是这里的this显然实用性比那个要大很多,哈哈。
简单来说,this有四种应用场景,分别是在构造函数上、对象属性中、普通函数中、call和apply方法中。
先来看第一种,构造函数:
function Foo(name){
this.name=name;
}
var f=new Foo();
在这里,this指向的是新对象f。而在对象属性中,这又有了一点不同。
var obj={
a:"funny",
b:function(){
console.log(this.a);
}
};
obj.b();//打印出funny
这里我们把b作为obj对象的一个属性来执行,执行的时候this就指向当前这个对象obj,所以在控制台会打印出funny;接下来看第三种情况,就那这个例子来说,我们稍微改动一下代码。
var obj={
a:"funny",
b:function(){
console.log(this.a);
}
};
var f1=obj.b;
f1(); //打印出undefined
在第九行中,我们执行f1发现根本取不到“funny”,而是打印出undefined。原因就是当我们这样作为一个普通函数执行的时候,this指向window对象的,而window对象下找不到a这个属性,于是就打印出undefined。顺便说一句,如果是找不到一个属性,会返回undefined;而找不到一个变量,则会返回“xxx is not defined”。
最后一种情况,在call和apply中。其实我们可以把call和apply当成一种特殊的执行方法。可以叫它“能自定义this指向的执行方法”,这个名字听起来是不是有点长,但原理的确如此。就是说当我们直接来一个f1()的时候,它的this默认为window。要改变怎么办呢?就要来点特殊执行手段,在中间多插入一个单词---call或者apply。
var obj={
a:"funny",
b:function(){
console.log(this.a);
}
};
var f1=obj.b;
f1.call({a:"serious"}); //改变了this的指向,指向这个新对象,打印出serious
还是这段代码,不过我稍微改了下,把它的this的指向扭了一下,最终指到我自己写的{a:"serious"}这个对象,然后就可以把serious打印出来了。apply和call差不多,因为这里我只传了一个参数,所以没法演示。call-->第一个参数为this,后面为其他参数;apply-->第一个参数为this,后面为用数组包裹起来的其他参数。就这么点区别。
应该还不错吧(`・ω・´)
“茴”字有四种写法,this也是一样的更多相关文章
- C#中克隆随机数的三种方法(为什么我想到了茴字的四种写法
C#中的Random类可以用来产生伪随机数(正确的废话 伪随机数的一个性质就是给定一个初始种子,那么产生的随机数列都是相同的,这个性质非常适合用在不同环境之间同步逻辑的场景. 最近有一个要克隆当前随机 ...
- python:函数中五花八门的参数形式(茴香豆的『回』字有四种写法)
毫不夸张的说,python语言中关于函数参数的使用,是我见过最为灵活的,随便怎么玩都可以,本文以数学乘法为例,演示几种不同的传参形式: 一.默认参数 def multiply1(x, y): retu ...
- 讨论下茴香逗的茴字有几种写法,javascript字符串数组查找“indexOf"的替代方式。
- 【JAVA8】Set排序四种写法
工作中遇到,写了很久以前的写法,师兄给了很多建议,于是整理了一下.孔子曰:"你知道茴香豆的茴字有几种写法吗?" 第一种,平常的写法: public class App { publ ...
- 茴香豆的“茴”有四种写法,Python的格式化字符串也有
茴香豆的"茴"有四种写法,Python的格式化字符串也有 茴香豆的"茴"有四种写法,Python的格式化字符串也有 被低估的断言 多一个逗号,少一点糟心事 上下 ...
- Python中斐波那契数列的四种写法
在这些时候,我可以附和着笑,项目经理是决不责备的.而且项目经理见了孔乙己,也每每这样问他,引人发笑.孔乙己自己知道不能和他们谈天,便只好向新人说话.有一回对我说道,“你学过数据结构吗?”我略略点一点头 ...
- swap函数的四种写法
swap 函数的四种写法 (1)经典型 --- 嫁衣法 void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } ( ...
- Android代码规范----按钮单击事件的四种写法
[前言] 按钮少的时候用第三种的匿名内部类会比较快,比如写demo测试的时候或者登陆界面之类. 按钮多的时候一般选择第四种写法. 一.第一种写法:在XML文件中声明onClick属性(很少用) 在XM ...
- JS 获取星期几的四种写法
今天是星期几的4种JS代码写法,有需要的朋友可以参考一下 第一种写法 复制代码代码如下: var str = ""; var week = new Date().getDay() ...
随机推荐
- vue2.0项目中使用Ueditor富文本编辑器示例
最近在vue项目中需要使用富文本编辑器,于是将Ueditor集成进来,作为公共组件. 在线预览:https://suweiteng.github.io/vue2-management-platform ...
- mysql 分组和聚合函数
mysql 分组和聚合函数 Mysql 聚集函数有5个: 1.COUNT() 记录个数(count(1),count(*)统计表中行数,count(列名)统计列中非null数) 2.MAX() 最大值 ...
- UML图学习之二 类图
类图(ClassDiagrams)是根据系统中的类以及各类之间的关系描述系统的静态视图.类图不仅显示系统内信息的结构,还描述系统内这些信息的行为.类图的一个重要目的是为其他图(如顺序图.交互图)定义一 ...
- flask_route错误:AttributeError: 'function' object has no attribute 'route'
问题: 路由完全正确,当只有一个名为home的函数处理这个路由时候,下一个路由处理函数,总是提示没有这个rotue属性 Traceback (most recent call last): File ...
- Storm集群安装与部署
准备 1.三台虚拟机 192.168.1.128 Nimbus 192.168.1.131 Supervisor 192.168.1.132 Supervisor 2.JDK1.8 3.Zookeep ...
- 使用copy命令合并二进制文件
CMD下的copy命令可以将一份或多份文件复制到另一个位置. 也具备连接文件的功能. 使用如下命令格式可以将多个二进制文件合并为一个二进制文件: copy /b file1+file2+...+f ...
- kickstart无人值守
笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 高逼格装系统的方法 Kickstar Cobbler 注意,kickstart并不是一个服务的名称,只是装系统的方 ...
- iOS导出ipa包时四个选项的意义
1. Save for iOS App Store Deployment 保存到本地 准备上传App Store 或者在越狱的iOS设备上使用 2. Save for Ad Hoc Deploymen ...
- Spring Boot 使用maven打包成jar
1.application.properties加入如下配置 server.port= 2.修改pom.xml <?xml version="1.0" encoding=&q ...
- [squid] kid1| ERROR: No forward-proxy ports configured.
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...