这篇文章主要是讲述js中的this是什么?是怎么来的?

我们首先创建一个person对象,如下:

var person = {
name: 'wyh',
age: 22,
sayHi: function (name, age) {
console.log('你好,我是' + name + ',今年' + age + '岁')
}
}

然后调用person.sayHi

person.sayHi(person.name, person.age)
//你好,我是wyh,今年22岁

我们得到了想要的结果,但是这个方式非常的麻烦

因为每次调用的时候sayHi方法的时候,都需要用person.xxx这样的方式传递我们需要的参数

而且person对象中的sayHi方法,需要设置相应形参与之对应

我们改进一下上面的传参方式

self作为形参(当然也可以用其它变量名,但是self更加形象,表示自身)

然后把person对象作为实参传入,这样我们就不需要去管想要传递person的哪个属性,因为self得到了整个person对象

var person = {
name: 'wyh',
age: 22,
sayHi: function (self) {
// 可以通过打印看到 self就是传入的person对象
// console.log(self);
// Object { name: "wyh", age: 22, sayHi: sayHi() }
console.log('你好,我是' + self.name + ',今年' + self.age + '岁')
}
}

然后再次调用person.sayHi()

person.sayHi(person)
//你好,我是wyh,今年22岁

结果还是和我们期望的一致

但是这样还是有些麻烦,我们最想要的是直接把person也省掉

于是JS的作者加了一个语法糖,这样我们可以直接使用person.sayHi() 这样的调用方式了。

但是有一个问题,如果 person.sayHi() 没有实参,那person.sayHi 函数是如何接收到 person 的呢?

JS的作者选择了,隐藏形参 self,然后用关键字 this 来访问 self

于是我们的代码变成了下面这样:

var person = {
name: 'wyh',
age: 22,
sayHi: function () {
// this隐藏了,我们可以通过打印的方式来看一下
// console.log(this);
// Object { name: "wyh", age: 22, sayHi: sayHi() }
console.log('你好,我是' + this.name + ',今年' + this.age + '岁')
}
}

我们再次调用person.sayHi()

person.sayHi()
//你好,我是wyh,今年22岁

结果依然和原来一样,而且我们通过打印发现的确有this的存在,而且this就是我们的person对象

那这个this到底从哪里来呢?

其实在你调用 person.sayHi() 时候,这个this就会指向person这个对象。

 

js中this由来的更多相关文章

  1. js中的块级作用域

    概述 函数是js中最常见的作用域单元, 声明在一个函数内部的变量或函数会在所处的作用域中隐藏起来, 这是有意为之的非常好的设计原则. 但是随着js的发展, 我们有了某个代码块(通常指{..}内部)隐藏 ...

  2. 30 行代码实现 JS 中的 MVC

    一连串的名字走马观花式的出现和更迭,它们中一些已经渐渐淡出了大家的视野,一些还在迅速茁壮成长,一些则已经在特定的生态环境中独当一面舍我其谁.但不论如何,MVC已经并将持续深刻地影响前端工程师们的思维方 ...

  3. js中[object Object]与object.prototype.toString.call()

    最近在用node读取文件中的json数据后,用JSON.parse()转成了json,然后响应数据传给前端,发现输出值object对象时显示[object object],在这里我们来看一下他的具体意 ...

  4. 5.0 JS中引用类型介绍

    其实,在前面的"js的六大数据类型"文章中稍微说了一下引用类型.前面我们说到js中有六大数据类型(五种基本数据类型 + 一种引用类型).下面的章节中,我们将详细讲解引用类型. 1. ...

  5. 【repost】JS中的异常处理方法分享

    我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...

  6. JS中给正则表达式加变量

    前不久同事询问我js里面怎么给正则中添加变量的问题,遂写篇博客记录下.   一.字面量 其实当我们定义一个字符串,一个数组,一个对象等等的时候,我们习惯用字面量来定义,例如: var s = &quo ...

  7. js中几种实用的跨域方法原理详解(转)

    今天研究js跨域问题的时候发现一篇好博,非常详细地讲解了js几种跨域方法的原理,特分享一下. 原博地址:http://www.cnblogs.com/2050/p/3191744.html 下面正文开 ...

  8. 关于js中的this

    关于js中的this this是javascript中一个很特别的关键字,也是一种很复杂的机制,学习this的第一步就是要明白this既不指向函数自身也不指向函数的词法作用域,this实际上是函数被调 ...

  9. 表值函数与JS中split()的联系

    在公司用云平台做开发就是麻烦 ,做了很多功能或者有些收获,都没办法写博客,结果回家了自己要把大脑里面记住的写出来. split()这个函数我们并不陌生,但是当前台有许多字段然后随意勾选后的这些参数传递 ...

随机推荐

  1. 使用 Vim 搭建 C/C++ 开发环境

    原文链接: https://spacevim.org/cn/use-vim-as-a-c-cpp-ide/ SpaceVim 是一个模块化的 Vim IDE,针对 C/C++ 语言的支持主要依靠 la ...

  2. 苹果手机Chrome浏览器显示input:disabled时字体颜色总是为浅灰色

    今天被测试人员提了个bug:苹果手机浏览器(Chrome)打开h5,控件在input:disabled的样式始终是浅灰色,要求改成黑色.测试对比:1.在多个pc浏览器上浏览input:disabled ...

  3. [视频教程] 如何在Linux深度系统deepin下安装docker

    笔记: 安装docker的命令 curl -sSL https://get.docker.com/ | sh service docker start 排查错误的命令 strace 视频地址在此:ht ...

  4. 【微学堂】线上Linux服务器运维安全策略经验分享

      技术转载:https://mp.weixin.qq.com/s?__biz=MjM5NTU2MTQwNA==&mid=402022683&idx=1&sn=6d403ab4 ...

  5. class 命名规范(三)

    抄自:https://www.jianshu.com/p/4945d9cf14e5 一.常见class关键词 布局类:header, footer, container, main, content, ...

  6. 剑指Offer-16.合并两个排序的链表(C++/Java)

    题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 分析: 可以用一个新的节点,来去比较两个单调递增的链表当前节点的值,如果p1当前的值小于p2,则新 ...

  7. k-means实战-RFM客户价值分群

    数据挖掘的十大算法 基本概念 导入数据集到mysql数据库中 总共有940个独立消费数据 K-Means 算法 K-Means 算法是一个聚类算法.你可以这么理解,最终我想把物体划分成 K 类.假设每 ...

  8. Linux学习笔记-第18天 有点迷茫。。

    有点迷茫学的这些知识的实用性..但愿今天可以用得到这些吧

  9. Vue v-if,v-else-if,v-else的使用

    v-else-if 要紧跟 v-if v-else要紧跟v-else-if 或 v-if 代码: <!doctype html> <html lang="en"& ...

  10. 【2019.8.14 慈溪模拟赛 T2】黑心老板(gamble)(2-SAT)

    \(2-SAT\) 考虑每个点只能选择\(R\)或\(B\),可以看作选\(0\)或\(1\). 然后对于给出的关系式,若其中一个位置满足关系式,另两个位置就必须不满足关系式,这样就可以对于每个关系式 ...