js中this由来
这篇文章主要是讲述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由来的更多相关文章
- js中的块级作用域
概述 函数是js中最常见的作用域单元, 声明在一个函数内部的变量或函数会在所处的作用域中隐藏起来, 这是有意为之的非常好的设计原则. 但是随着js的发展, 我们有了某个代码块(通常指{..}内部)隐藏 ...
- 30 行代码实现 JS 中的 MVC
一连串的名字走马观花式的出现和更迭,它们中一些已经渐渐淡出了大家的视野,一些还在迅速茁壮成长,一些则已经在特定的生态环境中独当一面舍我其谁.但不论如何,MVC已经并将持续深刻地影响前端工程师们的思维方 ...
- js中[object Object]与object.prototype.toString.call()
最近在用node读取文件中的json数据后,用JSON.parse()转成了json,然后响应数据传给前端,发现输出值object对象时显示[object object],在这里我们来看一下他的具体意 ...
- 5.0 JS中引用类型介绍
其实,在前面的"js的六大数据类型"文章中稍微说了一下引用类型.前面我们说到js中有六大数据类型(五种基本数据类型 + 一种引用类型).下面的章节中,我们将详细讲解引用类型. 1. ...
- 【repost】JS中的异常处理方法分享
我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...
- JS中给正则表达式加变量
前不久同事询问我js里面怎么给正则中添加变量的问题,遂写篇博客记录下. 一.字面量 其实当我们定义一个字符串,一个数组,一个对象等等的时候,我们习惯用字面量来定义,例如: var s = &quo ...
- js中几种实用的跨域方法原理详解(转)
今天研究js跨域问题的时候发现一篇好博,非常详细地讲解了js几种跨域方法的原理,特分享一下. 原博地址:http://www.cnblogs.com/2050/p/3191744.html 下面正文开 ...
- 关于js中的this
关于js中的this this是javascript中一个很特别的关键字,也是一种很复杂的机制,学习this的第一步就是要明白this既不指向函数自身也不指向函数的词法作用域,this实际上是函数被调 ...
- 表值函数与JS中split()的联系
在公司用云平台做开发就是麻烦 ,做了很多功能或者有些收获,都没办法写博客,结果回家了自己要把大脑里面记住的写出来. split()这个函数我们并不陌生,但是当前台有许多字段然后随意勾选后的这些参数传递 ...
随机推荐
- DS12C887实时时钟
实物图 引脚定义 GND. VCC:直流电源,其中VCC接+5V输入,GND接地,当VCC输入为+5V时,用户可以访问DS12C887内RAM中的数据,并可对其进行读.写操作:当VCC的输入小于+4. ...
- Linux中LVM逻辑卷管理
一.简介 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区 进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的 ...
- Plugin org.apache.maven.plugins:maven-resources-plugin:2.6
创建maven project时工程报错Plugin org.apache.maven.plugins:maven-resources-plugin:2.6 or one of its depende ...
- vue全局路由守卫beforeEach+token验证+node
在后端安装jsonwebtoken npm i jsonwebtoken --save 在 login.js文件中引入 // 引入jwtconst jwt = require ...
- 小程序的flex布局
小程序建议使用flex布局进行排版 flex就是一个盒装弹性布局 flex是一个容器,所有子元素都是他的成员 小程序的flex布局 定义布局 display:flex flex容器的属性: flex- ...
- 关联规则 -- apriori 和 FPgrowth 的基本概念及基于python的算法实现
apriori 使用Apriori算法进行关联分析 貌似网上给的代码是这个大牛写的 关联规则挖掘及Apriori实现购物推荐 老师 Apriori 的python算法实现 python实现关联规则 ...
- win10打印所有进程
#include <map> #include <iostream> #include <string> #include <windows.h> #i ...
- Spring Boot 自定义Intercepter
在 SpringBoot2.X 中 ,WebMvcConfigurerAdapter 被deprecated , 更好的做法是 implements WebMvcConfigurer 一.自定义拦截器 ...
- Jsoup+HttpUnit爬取搜狐新闻
怎么说呢,静态的页面,但我也写了动态的接口支持,方便后续爬取别的新闻网站使用. 一个接口,接口有一个抽象方法pullNews用于拉新闻,有一个默认方法用于获取新闻首页: public interfac ...
- Python进阶-XVV hashlib模块、configparse模块、logging模块
1.配置相关的configparse模块 配置文件如何组织?python中常见的是将配置文件写成py,然后引入该模块即可.优点是方便访问. 但是也有用类似windows中的ini文件的配置文件,了解即 ...