this笔记

2人阅读 评论(0) 收藏 举报
分类:

this提供了一种优雅的方式来隐式的“传递”一个对象引用,因此可以将API设计的更加简洁并且易于复用。

1,一些误解

1.1 指向自身

明显并不是指向函数自身的;

1.2 指向函数的作用域

作用域确实和对象类似,可见的标识符都是它的属性,但是作用域“对象”无法通过js代码访问,它存在于js引擎内部;

1.3事实

this是在运行时进行绑定的,并不是在编写的时候绑定,它的上下文取决于函数调用时的各个条件。this的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。

当一个函数被调用时,会创建一个活动记录(执行上下文),这个记录包含函数在哪里被调用(调用栈)、函数的调用方法、传入的参数等信息。this就是记录的一个属性,会在函数执行的过程中被用到;

就是说this实际上是函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用;

2 this解析

要理解this首先要理解调用位置,即函数被调用的位置,最重要的是分析调用栈,当前函数的前一个就是被调用的位置;

2.1 绑定规则

2.1.1 默认绑定

最常用的函数调用类型:独立函数调用。这条规则是无法应用其他规则时候的默认规则;

当函数是直接使用不带任何修饰的函数引用进行调用时,只能使用默认绑定;

当使用严格模式时,全局对象无法默认绑定,会绑定到undefined;,,,,,,

2.1.2 隐式绑定

指调用位置是否存在上下文对象,或者说是否被某个对象拥有;比如

function foo(){
  console.log(this.a);
}
var obj = {
  a:2,
  foo:foo
};
obj.foo(); // 2

这个函数不属于obj,但是调用位置会使用obj的上下文来引用函数,对象属性引用链只有最后一层会影响调用位置,比如obj1.obj2.foo(),会使用obj2的作用于;

隐式对修,

一个最常见的this绑定问题是被隐式绑定的函数会丢失绑定对象,从而把this绑定到全局对象或者undefined上,比如

function foo(){
  console.log(this.a);
}
var obj = {
  a:2,
  foo:foo
};
var bar = obj.foo;//函数别名
var a = "other words";
bar(); // "other words"

虽然bar是obj.foo的一个引用,但是事实上它引用的是foo函数本身,因此此时的bar实际上是一个不带任何修饰的函数调用,因此使用了默认绑定;

2.1.3 显式绑定

可以使用call或者apply方法显示的绑定this;js的宿主环境有时会提供一些非常特殊的函数,他们没有这两个方法,但是绝大多数函数以及自己创建的所有函数都可以使用call()&apply()方法。这两个函数的区别是call传递参数列表,apply传递一个参数数组。

在使用call或者apply时,如果第一个参数传入了一个原始值(字符串、布尔、数字类型)来当做this 的绑定对象,这个原始值会被转换成它的对向行驶(new String(..))。这个称为“装箱”

硬绑定,

var bar = function(){
  foo.call(obj);
}//这样使用bar来调用foo时this永远指向obj,就叫做硬绑定

ES5提供了内置的硬绑定方法,Function.prototype.bind,

var bar = foo.bind( obj );

2.1.4 new绑定

在js中,构造函数只是一些使用new操作符时被调用的函数,他们只是被new操作符调用的普通函数。所以事实上不存在构造函数,只有对函数的构造调用;

new的过程

1.创建一个新对象

2.这个新对象会被执行原型连接

3.这个新对象绑定到函数调用的this

4.如果函数没有返回其他对象,那么new表达书中的函数调用会自动返回这个新对象;

2.2 优先级

四条规则的优先级

默认绑定是在没有其他绑定时执行的,隐式绑定仅高于默认绑定;

在硬绑定(显示绑定的一种)和new绑定同时使用时,实际上new会修改硬绑定;

所以new绑定高于显示绑定;

new>显示绑定>隐式绑定>默认绑定(全局对象,严格模式绑定undefined)


2.3 例外

把null或者undefined作为this的绑定对象传递给call、apply或者bind会被忽略,执行默认绑定;


2.5 this词法

2.5.1箭头函数 =>

箭头函数不适用this的标准规则,而是根据外层(函数或者全局)作用域来决定this;

箭头函数的绑定无法被修改,和bind一样确保函数的this被绑定到指定对象,此外,其重要性还体现在它用更常见的词法作用域取代了传统的this机制

2.6 小结

要判断this 的指向,首先需要查找这个函数的直接调用位置,然后根据四条规则判断this 的绑定对象;

箭头函数不会使用标准规则,而是根据当前词法作用域来决定this,其实类似self=this;


查看评论

算法笔记算法笔记算法笔记

  • 2009年05月14日 22:34
  • 10KB
  • 下载

蚂蚁笔记.leanote转为知笔记支持的MD文档

本人搭建的蚂蚁笔记服务器最近被黑, 怀疑是蚂蚁笔记漏洞导致. ----------------------------------------------------------------- 所...
  • love100628
  • love100628
  • 2018-01-12 11:32:04
  • 359

jstl资料笔记笔记笔记笔记

  • 2008年11月04日 12:46
  • 6KB
  • 下载

excel笔记整理

1、excel:由微软公司生产的办公软件之一,电子制表软件,工作簿,可以用来做表格、进行数据处理等 2、打开方式: 方式一: 开始->所有程序->Microsoft office->Mi...
  • yangzai521
  • yangzai521
  • 2016-12-07 20:51:25
  • 614

【】笔记实习经典一汽【】

  • 2011年06月11日 12:00
  • 162KB
  • 下载

免费云笔记软件哪个好?

免费云笔记软件哪个好? 一、EverNote 印象笔记   这是国外的一款很知名的云笔记软件,其记事管理很是直观,用户可以通过它独特的分类方式,直接找到所记录的事项。同时它的笔记捕捉以...
  • mountzf
  • mountzf
  • 2016-12-10 23:33:20
  • 9267

js笔记—— 基础部分一

前言:js由三部分组成,1. 核心(ECMAScript),语法标准 2.文档对象模型(DOM) 3.浏览器对象模型(BOM) JavaScript 的核心语言特性在ECMA-262中是以...
  • panningwjr
  • panningwjr
  • 2016-05-25 17:17:30
  • 9169

Java丨仿“有道云笔记”项目 取名"Program 猿笔记"

- 项目名称:Program 猿笔记 - 开发工具:MyEclipse + Tomcat + JDK 1.7 - 相关技术:Editor.md、Servlet、Freemarker、Mysql、A...
  • lihaojie1996
  • lihaojie1996
  • 2017-04-24 15:18:29
  • 1526

java 学习笔记注意事项

  • 2011年05月20日 18:51
  • 64KB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 688
    积分: 128
    排名: 116万+
    文章分类
    文章存档