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()这个函数我们并不陌生,但是当前台有许多字段然后随意勾选后的这些参数传递 ...
随机推荐
- [转]JVM系列四:生产环境参数实例及分析【生产环境实例增加中】
原文地址:http://www.cnblogs.com/redcreen/archive/2011/05/05/2038331.html java application项目(非web项目) 改进前: ...
- apicloud含有微信支付。支付宝支付和苹果内购的代码
apicloud含有微信支付.支付宝支付和苹果内购的代码 <!DOCTYPE html> <html> <head> <meta charset=" ...
- ubuntu 改键
参考: https://www.jianshu.com/p/9411ee427cfd https://www.cnblogs.com/zhengchl/archive/2012/08/25/26557 ...
- Linux-TCP之深入浅出send和recv【转】
转自:https://www.cnblogs.com/JohnABC/p/7238417.html 内容摘自:TCP之深入浅出send和recv.再次深入理解TCP网络编程中的send和recv 建议 ...
- Git 常用命令:
Git 常用命令: 1.git status #查看本地工作文件夹有哪些改动(和本地仓库对比),把差别列出. 2.git log #查看commit 的日志.(git log -2 只看最近2次的co ...
- Matplotlib Date Index Formatter 日期索引格式化学习
官方网站:https://matplotlib.org/gallery/ticks_and_spines/date_index_formatter2.html#sphx-glr-gallery-tic ...
- 花了快一天,才搞出来的一个client-go的demo
用来直接获取所有service的annotaion里有ambassador的东东. 或者,watch集群事件. package main import ( "fmt" " ...
- 3. Vue - 指令系统
一.vue指令 (1) v-if // 条件判断 如果条件成立就在页面上生成一个标签并显示出来 (2) v-show //DOM中都存在只是显示与否 (3) v-for //注意 v-bind:key ...
- 【Eureka篇三】Eureka常用配置说明(7)
服务注册中心配置(Bean类:org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean) #关闭注册中心的保护机制, ...
- Python thread & process
线程 点击查看 <- 进程 点击查看 <- 线程与进程的区别 线程共享内部空间:进程内存空间独立 同一个进程的线程之间可以直接交流:两个进程之间想通信必须通过一个中间代理 创建新线程很简单 ...