在JavaScript中,this
的值取决于函数调用时的上下文。
全局上下文
- 行为描述:在任何函数之外执行
- 作用:引用全局对象
不同环境下区别:
- web浏览器:全局对象为
window
,引用window
对象 - Node.js环境:全局对象为
global
,引用global
对象
- web浏览器:全局对象为
函数上下文:
- 行为描述:在普通函数内部执行,值会取决于函数调用方式
不同调用方式区别:
函数在全局上下文中调用:
- 严格模式:this的值为
undefined
- 非严格模式:this的值为全局对象
- 严格模式:this的值为
函数是对象中的方法:
执行上下文:
- 描述:函数被调用的方式和位置
- this的值不绑定函数本身而是该函数被调用的对象。
外部词法上下文:
- 描述:函数外部
- 箭头函数不具有自己的this,从创建时的父作用域继承this
事件处理程序的上下文:
- 行为描述:事件处理程序中的
this
- 作用:this引用附加了事件监听器的元素,等同
event.currentTarget
区别:
event.target
:引发事件的实际DOM元素。对于冒泡事件,该元素是实际被点击的最内层元素是会冒泡到外部的元素。event.currentTarget
:表层触发事件的元素
- 行为描述:事件处理程序中的
构造函数上下文:
- 行为描述:构造函数内部的this元素
作用:引用新创建的对象,差不都就跟其他基于类的语言中的this含意一样了
引入
new
关键字知识:使用new时,js的操作:
- 创建一个空对象,就只是一个什么都没有的空对象
- 使用构造函数内部的
this
去引用这个新对象,新对象与构造函数内的this
关联起来 - 正常执行构造函数内容
- 如果构造函数没返回自己的对象就返回新对象。如果构造函数返回一个对象,就不返回新对象。如果返回其他任何内容就返回新对象。
类上下文:
- 行为描述:在类中的方法内调用this
- 作用:跟基于类的语言中this含意一致
显示/隐式绑定
- 行为描述:字面意思
- 作用:用来明确设置
this
的上下文 call
方法:- 描述:通过
.call()
调用,第一个参数成为调用该方法的函数的内部this
值,后续的参数会作为函数的参数传递进去 常见用途:
- 调用不属于当前对象的函数: 例如,借用其他对象的方法。
- 类数组对象(Array-like objects)上使用数组方法: 例如,
arguments
对象或NodeList
。
- 描述:通过
apply()
方法:- 描述:调用具有给定
this
值的函数,以及一个数组(类数组)提供参数 - 语法:
function.apply(thisArg, [argsArray])
第一个参数是指定给调用该方法的函数的this
值,第二个是传给函数的参数。 - 与
call()
区别:Apply 接受 Array (或 Arguments 对象)。
- 描述:调用具有给定
bind
方法:- 描述:js中内置的方法,允许我们设置方法中的this值。该方法创建新函数并将其this设置为提供的值,以及在调用新函数时提供一系列参数。
- 特点:创建了一个永久绑定的this值,无论任何调用该函数都不会更改this值
- 用途:在设置事件处理程序时,希望
this
值始终引用特定对象,或者在使用调用回调函数的库或框架时,希望在回调中控制this
引用的对象。