说到这个地方又想起以前高中还是初中学的《孔乙己》这个梗,但是这里的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也是一样的更多相关文章

  1. C#中克隆随机数的三种方法(为什么我想到了茴字的四种写法

    C#中的Random类可以用来产生伪随机数(正确的废话 伪随机数的一个性质就是给定一个初始种子,那么产生的随机数列都是相同的,这个性质非常适合用在不同环境之间同步逻辑的场景. 最近有一个要克隆当前随机 ...

  2. python:函数中五花八门的参数形式(茴香豆的『回』字有四种写法)

    毫不夸张的说,python语言中关于函数参数的使用,是我见过最为灵活的,随便怎么玩都可以,本文以数学乘法为例,演示几种不同的传参形式: 一.默认参数 def multiply1(x, y): retu ...

  3. 讨论下茴香逗的茴字有几种写法,javascript字符串数组查找“indexOf"的替代方式。

  4. 【JAVA8】Set排序四种写法

    工作中遇到,写了很久以前的写法,师兄给了很多建议,于是整理了一下.孔子曰:"你知道茴香豆的茴字有几种写法吗?" 第一种,平常的写法: public class App { publ ...

  5. 茴香豆的“茴”有四种写法,Python的格式化字符串也有

    茴香豆的"茴"有四种写法,Python的格式化字符串也有 茴香豆的"茴"有四种写法,Python的格式化字符串也有 被低估的断言 多一个逗号,少一点糟心事 上下 ...

  6. Python中斐波那契数列的四种写法

    在这些时候,我可以附和着笑,项目经理是决不责备的.而且项目经理见了孔乙己,也每每这样问他,引人发笑.孔乙己自己知道不能和他们谈天,便只好向新人说话.有一回对我说道,“你学过数据结构吗?”我略略点一点头 ...

  7. swap函数的四种写法

    swap 函数的四种写法 (1)经典型 --- 嫁衣法 void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } ( ...

  8. Android代码规范----按钮单击事件的四种写法

    [前言] 按钮少的时候用第三种的匿名内部类会比较快,比如写demo测试的时候或者登陆界面之类. 按钮多的时候一般选择第四种写法. 一.第一种写法:在XML文件中声明onClick属性(很少用) 在XM ...

  9. JS 获取星期几的四种写法

    今天是星期几的4种JS代码写法,有需要的朋友可以参考一下 第一种写法 复制代码代码如下: var str = "";  var week = new Date().getDay() ...

随机推荐

  1. Tomcat8配置Https协议,Tomcat配置Https安全访问,Tomcat Https配置

    Tomcat8配置Https协议,Tomcat配置Https安全访问,Tomcat Https配置 ============================== ©Copyright 蕃薯耀 2017 ...

  2. MYSQL Optimizing LIMIT Queries

    如果要指定查询的数据行数,在查询语句中使用limit子句,而不是获取所有数据行结果集,然后去掉没用的数据. MYSQL有时会对没有having子句,带有limit关键字的查询进行优化: 1:如果用li ...

  3. intent详解(一)

    摘录自:http://blog.csdn.net/harvic880925/article/details/38399723 前言:通过重新翻看Android入门书籍,才发现原来自己露掉了那么多基础知 ...

  4. python-虎扑爬虫

    Python作为一个高级编程语言,不知从何时起就在圈子里流行起来了.个人也是图个鲜,跟上时代步伐学习了一下."鲁迅"说过:不能学以致用,就是耍流氓.我用python对虎扑论坛作了一 ...

  5. Linuxc - 操作系统内存分配

    静态变量是存储在数据段的,在函数中可以共用. 全局变量也是存储在数据段的,在全局中可以共用. 指针变量本质上是地址,数组变量本质上也是地址. 数组是可靠的,不可变的地址.指针变量是不可靠的,可变的.数 ...

  6. linux_磁盘分区

    分区并没有数据内容只是改变分区表,保存在0磁头,0磁道1扇区除MBR引导后64bytes中,只能有4个组分区,4个以上要一个扩展分区 引导MBR,保存在446字节中 磁盘想要存放数据,首先要分区,可以 ...

  7. windows的三种内存管理方法

    Windows的内存管理方法 windows提供了3种方法来进行内存管理: l         虚拟内存,最适合用来管理大型对象或者结构数组 l         内存映射文件,最适合用来管理大型数据流 ...

  8. linux ngix安装

    因为我完全按照第一篇参考文章从上到下一步步安装导致有些安装失败最后重装的,过程有点乱,就没自己总结please read the follow articles Linux 安装Nginx详细图解教程 ...

  9. Python 斐波那契数列练习

    # coding=gbk # 迭代法---1 def fibonacci (n): if n == 0 or n == 1: return n else : a = 0 b = 1 for i in ...

  10. awk之FIELDWIDTHS字段宽度

    $ cat file 1234567890 $ awk -vFIELDWIDTHS="1 2 3 4 5" -vOFS="|" 'NF=NF' file 1|2 ...