this关键字

364 阅读2分钟

定义

在绝大多数的情况下,函数的调用方式决定了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的指向

    1. f.call(参数1,.....)
      函数立即执行,并且将函数中的this指向参数1,参数1后面的参数作为函数调用的实参传递
      参数1为null,则不改变函数中的this指向
    1. f.apply(参数1,[...])
      函数立即执行,this指向参数1(和f.call(参数1,...)一样,只是传到函数的实参方式不一样,)
    1. f.bind(参数1)
      不会立即执行函数,会返回一个和原函数一模一样的函数,只是返回的新函数中的this指向参数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);