定义
在绝大多数的情况下,函数的调用方式决定了this的值(运行时绑定).this不能在执行期间被赋值,并且在每次函数被调用this的值也可能不同。ES5引入了bind方法来设置函数的this值,而不用考虑函数如何被调用的。ES2015引入了箭头函数,箭头函数不提供自身的this绑定(this的值将保持为闭合词法上下文的值)
值
当前执行上下文(global、function或eval)的一个属性,在非严格模式下,总是指向一个对象,在严格模式下可以是任意值
适用的情况举例
- 全局上下文
无论是否在严格模式下,在全局执行环境中(在任何函数体外部),this都指向全局对象
在函数内部
this的值取决于函数被调用的方式(除箭头函数外)
函数中的this关键字,谁调用指向谁(除箭头函数外)
箭头函数中的this的指向和谁调用没有关系,和定义函数的位置有关
箭头函数中的this指向,定义函数的上下文
- 非严格模式下 当this的值不是由该调用的设置的,所以this的值默认指向全局对象,浏览器中就是window
functio f1(){
return this;
}
//在浏览器中;
f1() === window; //在浏览器中,全局对象就是window
//在Node中;
f1() === globalThis;
- 在严格模式下
如果进入执行环境时没有设置this的值,this会保持为undefined,
因为f2是被直接调用的,而不是作为对象的属性或方法调用的(如 window.f2()).如下:
function f2(){
"use strict";//这里是严格模式
return this;
}
f2() === undefined;//true
1.全局函数中的this window
2.定时器中的函数的this window
3.自调用函数中的this this
4.事件处理函数的this 事件源、
5.对象方法中的函数this 指向调用方法的对象
6.箭头函数中没有自己的this关键字
改变this的指向
-
- f.call(参数1,.....)
函数立即执行,并且将函数中的this指向参数1,参数1后面的参数作为函数调用的实参传递
参数1为null,则不改变函数中的this指向
- f.call(参数1,.....)
-
- f.apply(参数1,[...])
函数立即执行,this指向参数1(和f.call(参数1,...)一样,只是传到函数的实参方式不一样,)
- f.apply(参数1,[...])
-
- f.bind(参数1)
不会立即执行函数,会返回一个和原函数一模一样的函数,只是返回的新函数中的this指向参数1,
新函数的调用参数传了啥就是啥
- f.bind(参数1)
let obj={name:10,age:20};
function fn(a,b){
console.log(this);//{name: 10, age: 20}
console.log(a+b)//5
}
let ff=fn.bind(obj);
ff(2,3);