### 烦人的this
JavaScript的表现与之前学的任何传统的语言都不一样,这个就很烦人,这几天把这个坑扫除了
### this到底指向什么
总的来说,总结下,this其实取决于调用者的上下文环境,好比直接调用函数,是在全局作用域下的,就是直接this就是Window
```javascript
function fn(){
console.log(this)
}
fn()//Window
```
而如果将作为对象中的属性,objA.objB.fun()这个时候this就是objB
```javascript
function fn(){
console.log(this)
}
objA={
a:123,
myfun:fun
}
objA.fun()//objA
```
同样的道理可以延伸到对象的事件,注册事件其实就是将对应对象的上下文环境中的某个属性例如click绑定一个函数,这样的话,函数内部的this就是调用者本身
```javascript
document.querySelector("#btn").onclick = function(){
console.log(this)
}//<input type="button"/>
```
需要注意的是,理解什么是上下文环境,千万不要把上下文环境错认为就是所谓的作用域
```javascript
function fnChain_1() {
console.log(this)
fnChain_2()
}
function fnChain_2() {
console.log(this)
fnChain_3()
}
function fnChain_3() {
console.log(this)
}
fnChain_1()
//三个都是Window
```
上面实例代码是错误理解上下问环境的典范
### ES6的this
ES6引入了箭头函数,这时this的表现与我们之前接触的又不一样了,具体不同点如下:
+ 普通的函数的this取决于调用上下文
+ 而ES6里面的this是继承父执行上下文的this
实例代码如下:
```javascript
//代码来自于https://blog.csdn.net/qq_38563845/article/details/78145814
var name = "window";
var obj = {
name: 'obj',
//普通函数
one: function(){
    console.log(this.name)
},
//箭头函数
two: ()=> {
     console.log(this.name)
},
//普通函数中的箭头函数
three: function(){
    (()=>{
        console.log(this.name)
     })()
},
//多层箭头函数
four: ()=> {
    (()=>{
        console.log(this.name)
     })()
}
}
obj.one(); //obj
obj.two();   //window
obj.three(); //obj
obj.four() //window
```
下面分析我们的想法来个例子:
```javascript
function foo() {
return () => {
return () => {
return () => {
console.log(this);
};
};
};
}
foo()()()()//Window
```
如果将上面的代码改为:
```javascript
foo().call({a:"HelloWorld"})()()()
//{a:"HelloWorld"}
```
至于call是干什么的,接下来来解释

蛋疼的JavaScript(二)this的更多相关文章

  1. 从头开始学JavaScript (二)——变量及其作用域

    原文:从头开始学JavaScript (二)--变量及其作用域 一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符 ...

  2. SkylineDemoForWeb JavaScript二次开发示例代码

    SkylineDemoForWeb JavaScript二次开发示例代码 http://files.cnblogs.com/files/yitianhe/SkylineDemoForWeb.zip

  3. JavaScript二(第一个js程序)

    一.<script>xxxx</script>标签解析 1.charset :可选,表示通过src属性指定的字符集,由于大多数浏览器忽略它,所以很少有人用它2.defer:可选 ...

  4. Javascript 二维码生成库:QRCode

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 初识JavaScript(二)

    初识JavaScript(二) 我从上一篇<初识JavaScript(一)>知道和认识JavaScript的词法结构,也开始慢慢接触到了JavaScript的使用方法,是必须按照JavaS ...

  6. (转)JavaScript二:JavaScript语言的基本语法要求

    摘自:http://blog.csdn.net/erlian1992 要学习好JavaScript,首先我们要懂JavaScript语言的一些基本语法要求: 一,区分大小写 JavaScript语言区 ...

  7. 以Python角度学习Javascript(二)之DOM

    HTML DOM 定义了访问和操作 HTML 文档的标准方法. DOM 将 HTML 文档表达为树结构. 文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文 ...

  8. javascript二维数组

    var a= new Array(new Array(1,2),new Array('b','c')); document.write(a[1][1]); 说白了,就是利用for循环定义二维数组! & ...

  9. javascript二维数组排序

    js使用sort()函数对二维数组快速排序的写法 作者:admin    时间:2015-7-3 9:31:4    浏览:1847 js数组的排序方法有很多,冒泡法,插入法等等,不过对于数组的排序来 ...

随机推荐

  1. LUOGU P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)

    传送门 解题思路 学习了一下玄学算法--模拟退火,首先要求平衡处,也就是求势能最小的地方,就是求这个点到所有点的距离*重量最小.剩下的几乎是模拟退火的板子了. #include<iostream ...

  2. zabbix--------配置邮件报警功能---服务器上配置---------

    --------配置邮件报警功能---服务器上配置--------- [www.aa.com@ ~]# yum install mailx -y [www.aa.com@ ~]# vi /etc/ma ...

  3. Codeforces Round #599 (Div. 2)的简单题题解

    难题不会啊…… 我感觉写这个的原因就是因为……无聊要给大家翻译题面 A. Maximum Square 简单题意: 有$n$条长为$a_i$,宽为1的木板,现在你可以随便抽几个拼在一起,然后你要从这一 ...

  4. 深入浅出 Java Concurrency (25): 并发容器 part 10 双向并发阻塞队列 BlockingDeque[转]

    这个小节介绍Queue的最后一个工具,也是最强大的一个工具.从名称上就可以看到此工具的特点:双向并发阻塞队列.所谓双向是指可以从队列的头和尾同时操作,并发只是线程安全的实现,阻塞允许在入队出队不满足条 ...

  5. rocketmq 延时消息

    rocketmq  的延时消息不能支持任意延时,她定义了18 个延时等级,并且我们可以指定这18 个延时等级的延时时间. 发送消息的时候只需在消息中指定 当前消息的 延时等级即可,并且这个延时消息不是 ...

  6. Spring MVC(五)--控制器通过注解@RequestParam接受参数

    上一篇中提到,当前后端命名规则不一致时,需要通过注解@RequestParam接受参数,这个注解是作用在参数上.下面通过实例说明,场景如下: 在页面输入两个参数,控制器通过注解接受,并将接受到的数据渲 ...

  7. MyBatis - Mapper动态代理开发

    Mapper接口开发方法编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象. Mapper接口开发方式是基于入门程序的基础上,对 控制程序 进行分层开发, ...

  8. Odoo(OpenERP)配置文件详解

    [options] ; addons模块的查找路径 addons_path = E:\GreenOdoo8.0\source\openerp\addons ; 管理员主控密码(用于创建.还原和备份数据 ...

  9. 最小费用最大流——EK+SPFA

    终于把最小费用最大流学会了啊-- 各种奇奇怪怪的解释我已经看多了,但在某些大佬的指点下,我终于会了. 原来是个好水的东西. 最小费用最大流是什么? 不可能不知道网络流吧?如果不知道,自行百度去-- 费 ...

  10. 模板:exlucas

    求$C_n^m mod p$,其中p不是质数且不保证p能分解为几个不同质数的乘积(也就是不能用crt合并) #include<iostream> #include<cstdio> ...