this
,即当前执行代码的环境对象。
换句话说,执行的每个JavaScript
函数都有对其当前执行上下文的引用,称为this
。
一、执行上下文
执行上下文代表函数的调用方式,大多数情况下,函数的调用方式决定了this
的值。即,执行上下文决定了this
的值。
要理解这个关键字this
,只需要this
取决于函数的调用方式,跟函数声明以及声明位置没关系。
比如看下面这段代码:
function person() {
console.log(this.name);
}
let name = "sueRimn";
let one = {
name: "八至", age: 22};
let two = {
name: "小九", age: 22};
person(); // "sueRimn"
one.person(); // "八至"
two.person(); // "小九"
代码中函数person()
的执行任务是打印出this.name
,即打印当前执行上下文的name
属性的值。
当函数person()
没有被调用时,执行上下文也没有指定,默认为当前全局下,this.name
就是全局变量的值"sueRimn"
。
而one.person()
是代表函数person()
被one
调用,此时函数的执行上下文是one
,即执行上下文this.name
的值就是one.name
的值,two.person()
也是相同道理。
注意:
this
不能在函数执行期间被赋值- 函数每次被调用时
this
的值不同
二、this
关键字的绑定规则
this
的绑定分为:
- 默认绑定与隐式绑定
- 显示绑定与固定绑定
1、默认绑定和隐式绑定
- 严格模式下:
this
的默认值是undefined
- 非严格模式下:
this
默认指向全局对象 - 在函数内部,
this
的值取决于函数被调用的方式 - 当有一个作为方法调用的对象属性时,该对象是该方法的
this
对象或执行上下文对象,这是this
关键字的隐式绑定
只要记住,在函数内部,this
的值取决于函数被调用的方式,与函数声明时间、地点无关。
//在浏览器中, window对象同时也是全局对象
// this的默认绑定
console.log(this === window);//true
const AG