这篇文章主要是讲述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. iOS中的GCD线程

    一.什么是GCD      全称是Grand Central Dispatch ,纯C语言编写,提供非常多强大的函数,是目前苹果官网推荐的多线程开发方法,NSOperation 便是基于GCD的封装 ...

  2. Android Activity 开发常用技巧整理

    1.设置 Activity 背景色为透明 在style.xml里面声明: <style name="TranslucentActivityStyle" parent=&quo ...

  3. 依赖弹出框lhdaiglog的基于WebUploader批量上传图片

    初始上传界面 //链接添加弹窗 html代码段↓ var msgcontent = ""; msgcontent += '<ul class="linkAddBox ...

  4. [20191011]bash任意进制编码表.txt

    [20191011]bash任意进制编码表.txt --//bash可以使用任意进制编码转化为十进制.我想了解内部编码:--//实际上受字符集的限制,"任意"进制有限制的.测试看看 ...

  5. [20191003]oracle number类型存储转化脚本.txt

    [20191003]oracle number类型存储转化脚本.txt --//完善脚本,增加支持科学记数法.比如1e4之类的写法. 2.测试:$ cat test.txt012251234100-4 ...

  6. MySQL 时间类型 DATE、DATETIME和TIMESTAMP

    1.DATE.DATETIME和TIMESTAMP 表达的时间范围 Type Range Remark DATE '1000-01-01' to '9999-12-31' 只有日期部分,没有时间部分 ...

  7. Mysql—事务原理与详解

    事务的四大特性 事务的隔离级别 https://www.cnblogs.com/57rongjielong/p/8036418.html https://blog.csdn.net/zwq123211 ...

  8. [视频教程] 使用composer安装使用thinkphp6.0框架

    安装composer -vvv的参数是表示展示安装进度,测试时使用其他参数安装失败,一直卡着不动curl -vvv https://getcomposer.org/installer | phpmv ...

  9. 初始FPGA

    FPGA和单片机的区别 单片机 FPGA 哈佛总线结构,或者冯诺依曼结构 查找表 串行执行 并行执行 软件范畴 硬件范畴 C/汇编语言编程 Verilog HDL/ VHDL硬件描述语言编程 FPGA ...

  10. C++学习七 C++实现add(1)(2)(3)

    一.代码实现: class Yoba { public: Yoba(int n) : _n(n) {} Yoba operator() (int n) { return Yoba(_n + n); } ...