this JavaScript中的关键字 被自动定义在所有函数的作用域中 隐式传递对象的引用
this是在函数在被调用的过程中动态绑定的,完全取决于函数的调用位置
调用位置 调用栈 → 函数调用链
绑定规则:
1 默认绑定:独立函数调用 this对象会被绑定到全局对象或undefined上
在严格模式下( 使用了'use strict';)this会被指向undefined
决定 this 绑定对象的并不是调用位置是否处于严格模式,而是 函数体是否处于严格模式。如果函数体处于严格模式,this 会被绑定到 undefined,否则 this 会被绑定到全局对象。
2 隐式绑定:调用位置有上下文对象 ,被调用函数中的this会被指向拥有它的那个上下文对象 eg:obj.fn()
3 显示绑定:
硬绑定:call(...) apply(...) bind(...) 直接指定函数中this对象的指向 一旦使用后,this对象的指向不会被更改,即使再调用该函数执行后也是
4 new绑定:构造函数调用,会创建一个新对象并把这个对象绑定到函数调用的this (使用bind生成的构造函数 通过new出的对象 this指向自己)
一般情况下,优先级 new > 显式绑定call apply bind... > 隐式绑定 obj.fn()... > 默认绑定
5 绑定例外:
(1)call apply 将null或undefined作为绑定对象传入时,使用默认绑定。使用场景在不关心this指向时:
ES6之前 将数组展开为参数 fn.apply(null,[2,3])
对参数进行的柯里化(将具有多个参数的函数转换为单参数函数链)
(2)间接引用,使用默认绑定
(3) 软绑定:硬绑定基础上的一种处理,用于覆盖默认绑定
(4) this词法
箭头函数 => 该函数的作用域由外层(函数或是全局) 作用域来决定this的 ,箭头函数会继承外层函数调用的 this 绑定(无论 this 绑定到什么)