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()这个函数我们并不陌生,但是当前台有许多字段然后随意勾选后的这些参数传递 ...
随机推荐
- css伪类实现行号自动填充
css伪类实现行号自动填充 大多数时候我们需要行号自动填充的时候我们可以 大多数时候是插入元素, 在元素里用js填入行号,或者用 ol > li 实现行号填充, 对于上面的方式,都不太灵活,而且 ...
- typora使用说明
一级标题 # 空格 编写内容 二级标题 ## 空格 编写内容 有序内容 1.+Tab 无序内容 -+Tab 代码块 print("hello wrold") typora快捷键 c ...
- Mysql Join-连接查询(中)
Mysql Join-连接查询(中) 认识 就我平时的数据接触来看, 连接查询也没有很复杂,不够是非常需要耐心和逻辑的, 一点点将数据查出来, 拼接等. 没有什么技巧, 多练习就会了. 无非就是表之间 ...
- C语言中函数返回字符串的4中方法
C语言中函数返回字符串的4中方法 函数的构成部分:返回类型.函数名称.参数.函数主体 参数:函数调用时传入的参数称为实参,函数定义时出现的参数为形参 形参的作用在于接收实参传入的值,形参和函数内部的其 ...
- CodeForces - 1251B (思维+贪心)
题意 https://vjudge.net/problem/CodeForces-1251B n个01串,可以任意交换任意两个字符串的字符任意次,问最多能有多少个回文串. 思路 分类讨论可以发现规律: ...
- 1.Python网络编程_UDP(简略版)
# -*- coding: utf-8 -*- #2019-11-24 import socket def recv(): udp_socket=socket.socket(socket.AF_INE ...
- excel工资表,转化为word工资单
1.新建excel表,.xls格式; .xlsx格式的添加到word中会报错‘无法打开数据源’(office 2007): 2.新建word文档.docx格式: 3.邮件——开始邮件合并——信函,选择 ...
- 2018年蓝桥杯B组C/C++决赛题解
2018年第九届蓝桥杯B组C/C++决赛题解 点击查看2018年蓝桥杯B组C/C++决赛题目(不含答案) 1.换零钞 ok 枚举 设x表示1元钱的个数,y表示2元钱的个数,z表示5元钱的个数 x+21 ...
- c# WF 第8节 label控件
本节内容: 1: 文本控件 2:实现label的你追我赶实例 1:文本控件 2:实现label的你追我赶实例 步骤1 : 步骤2 : 知识点:
- leetcode 排序问题
1.堆排序 //大顶堆的构造,传入的i是父节点 void HeapAdjust(int k[],int p,int n) { int i,temp; temp = k[p]; * p; i <= ...