2.this全面解析

2.1  调用位置

调用位置就是函数在代码中被调用的位置
 
分析调用栈:当前位置的函数调用列表,就是调用栈。栈中的第二个元素,就是真正的调用位置

2.2  绑定规则

  • 默认绑定
独立函数调用:应用了this的默认绑定(指向全局对象),严格模式下,全局对象无法使用默认绑定,绑定到undefined。
决定this绑定对象的并不是调用位置处于严格模式而是函数体是否处于严格模式
  • 隐式绑定
当函数引用有上下文对象时,this绑定到这个上下文对象
对象属性引用链中只有最顶层(最后一层)会影响调用位置
  • 显式绑定
call(...)、apply(...)
如果传入一个原始值,这个原始值会被转换成他的对象形式,即 new String()。这种方式被称为装箱
  • new绑定
在JavaScript中,构造函数只是一些使用new操作符时被调用的函数。他们并不属于一个类,也不会实例化一个类,它们甚至都不能说是一种特殊的函数类型,他们只是被new操作符调用的普通函数。

实际上并不存在所谓的“构造函数”,只有对于函数的“构造调用”。
 
使用new来调用函数,会执行以下操作:
  1. 创建(构造)一个全新的对象
  2. 这个新创建的对象会被执行“原型”连接
  3. 这个新对象会绑定到函数调用的this
  4. 如果函数没有其他返回对象,那么new表达式中的函数调用会自动返回这个新对象。

2.3  优先级

判断this:
1. 函数是否在 new 中调用( new 绑定) ? 如果是的话 this 绑定的是新创建的对象。
var bar = new foo()
2. 函数是否通过 call、 apply( 显式绑定) 或者硬绑定调用? 如果是的话, this 绑定的是
指定的对象。
var bar = foo.call(obj2)
3. 函数是否在某个上下文对象中调用( 隐式绑定) ? 如果是的话, this 绑定的是那个上
下文对象。
var bar = obj1.foo()
4. 如果都不是的话, 使用默认绑定。 如果在严格模式下, 就绑定到 undefined, 否则绑定到
全局对象。
var bar = foo()

2.4  绑定例外

2.4.1  被忽略的this

如果把null或undefined作为this的绑定对象传入call,apply或bind,这些值在调用时会被忽略,实际应用的是默认绑定规则。
apply bind
安全的做法是传入一个特殊的对象,把this绑定到这个对象不会对程序产生任何副作用
 ∅ = Object.create(null);保护全局对象
 

2.4.2  间接引用

  1. function foo(){
  2. console.log(this.a);
  3. }
  4. var a = 2;
  5. var o = {a:3,foo;foo};
  6. var p = {a:4};
  7. o.foo(); //3
  8. (p.foo = o.foo)(); //2
(p.foo = o.foo) 的返回值是 目标函数的引用。因此调用位置是foo()

 
 

2.4.3  软绑定

硬绑定会大大降低函数的灵活性,硬绑定之后无法使用隐式绑定或显示绑定来修改this
 
softBind
 

2.5  this用法

箭头函数不使用this的四条标准规则,而是根据当前的作用域来解决this
箭头函数会继承外层函数调用的this绑定,绑定无法被修改,new也不行。
箭头函数和self = this都可以取代 bind();从本质来说,想取代的是this机制。
需尽量用bind,避免使用 箭头函数和self = bind;
 
 
 
 
 
null

转载于:https://www.cnblogs.com/Natsume5233/p/6488844.html

第二章 this全面解析相关推荐

  1. 微型计算机原理第二章作图题,工程制图第二章习题答案解析.doc

    WORD文档可编辑 技术资料 专业分享 第二章 点.直线.平面的投影----点的投影 班级 学号 姓名 2-1.求各点的第三投影,并填上各点到投影面的距离. A点距V面( 5 ).距H面( 6 ).距 ...

  2. Spring MVC框架:第二章:视图解析器和@RequestMapping注解使用在类级别及获取原生Servlet API对象

    SpringMVC使用细节 第一节 视图解析器 通过HelloWorld程序我们看到了handler方法的返回值表示: 请求处理完成后,请SpringMVC执行一个请求转发.转发的地址就是handle ...

  3. 《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第二章——自编解析与答案

    2.1 在80x86微机的输入/输出指令中,I/O端口号通常是由DX寄存器提供的,但有时也可以在指令中直接指定00~FFH的端口号.试问可直接由指令指定的I/O端口数. 解析: P31-2.5 外部设 ...

  4. 华文慕课计算机组成结构第二章课后习题解析

    1.(5分) 下列哪些定律属于计算机行业的著名"定律"? A. 摩尔定律 B. 反摩尔定律 C. 墨菲定律 D. 马太效应 E. 木桶定律 答案: A,B 2.(5分) 当前摩尔定 ...

  5. R语言分析(二)——薛毅R语言第二章后面习题解析

    包括2.2-2.6中间的习题,2.2的习题中第三问和第四问,应该有其他的解答方法,但我看他的题目,似乎是在A和B的基础上进行,所以就选择了使用for循环的方法 做着习题,又不断查着书,这样,书籍也熟悉 ...

  6. 华文慕课北大操作系统陈向群第二章课后题解析

    1.(5分) 控制和状态寄存器用于控制处理器的操作,在某种特权级别下可以访问.修改.下列哪一个不是控制和状态寄存器 A. 程序计数器(PC) B. 指令寄存器(IR) C. 程序状态字(PSW) D. ...

  7. 第二章 PX4-Pixhawk-RCS启动文件解析

    第二章 PX4-RCS启动文件解析 RCS的启动类似于linux的shell文件,如果不知道shell文件是什么东西可以理解成是为程序的流程框,它是告诉处理器应该怎么样去运行,前一章介绍的是编译成固件 ...

  8. 第二章 PX4-RCS启动文件解析

    版权声明:本文为博主原创文章,未经博主允许不得转载. 第二章 PX4-RCS启动文件解析 RCS的启动类似于linux的shell文件,如果不知道shell文件是什么东西可以理解成是为程序的流程框,它 ...

  9. 叉积 微分 恒等式_考研真题分章解析 | 第二章 导数与微分

    高数思维 导读:本系列专辑为考研真题分章解析,主要包括:函数.极限与连续.一元函数微分学.一元函数积分学.多元函数微分学.多元函数积分学.空间解析几何.级数.微分方程等内容,共计12章,整理了近32年 ...

  10. 集装箱计算机跟踪管理方式,集装箱运输第二章集装箱及其箱务管理(图文)解析.ppt...

    集装箱运输第二章集装箱及其箱务管理(图文)解析 第2章 集装箱及其箱务管理 2.1 集装箱及其标准化 2.2 集装箱箱务管理业务 2.3 集装箱跟踪管理及箱务管理现代化 2.1 集装箱及其标准化 2. ...

最新文章

  1. (C++)1037 在霍格沃茨找零钱的两种解法
  2. filter,map,reduce,apply函数
  3. iOS8开发~UI布局(二)storyboard中autolayout和size class的使用详解
  4. Oracle数据库创建表空间及用户授权
  5. 一文搞懂*argv和**kwargs
  6. win10鼠标灵敏度怎么调_和平精英,灵敏度到底怎么调?小编视频来教你!
  7. win10计算机管理看不见蓝牙,解决win10蓝牙开关不见了的方法
  8. coin3d碰撞检测的实现
  9. 原理图端口符号_什么是电气原理图和电气接线图,二者区别及绘制要求是什么?...
  10. 如何线上推广引流?百度知道实现精准引流
  11. 「驱动安装」HighPoint RocketRAID R2722 磁盘阵列卡 驱动安装教程
  12. 贝塞尔曲线及实践案例
  13. 第46届EC-Final总结
  14. matlab中psf2otf作用,Matlab中psf2otf()函数在opencv中的实现
  15. MathType如何正确卸载?
  16. 有趣的MATLAB小程序
  17. 系统设计中的集群隔离和机房隔离
  18. 【转】常用电源转换芯片
  19. Python 数据可视化神器分享:pyecharts
  20. Redis缓存有效时间设置到第二天凌晨的秒数

热门文章

  1. 运维定位服务故障时,前5分钟都在忙啥?
  2. Google Play 即将返华?
  3. tomcat8打开闪退_直接双击启动tomcat中的startup.bat闪退原因及解决方法
  4. ActiveMQ下载与安装(Linux环境下进行)
  5. 微分算子求解微分方程
  6. 动态规划之背包问题 - 01背包+完全背包+多重背包
  7. Java基础--序列化和反序列化
  8. jQuery 选择器简介
  9. Javascript 事件入门
  10. Java并发编程:进程和线程之由来__进程让操作系统的并发性成为可能,而线程让进程的内部并发成为可能...