了解JavaScript中的this关键字

210 阅读3分钟

什么是this

在JavaScript中,this关键字是指当前正在执行代码的对象。通常情况下的this指向如下:

  • 默认绑定
    • 默认情况下,this指向全局对象
    • 在函数中,当不处于严格模式时,this指向全局对象
    • 在函数中,在严格模式下this为undefined
  • 隐式绑定
    • 如果一个函数中有this,这个函数又被上一级的对象所调用,那么this指向的就是上一级的对象
    • this指向的是被调用方法的上一级对象,而不是它的最外层对象
    • this 是在运行时被确定,而不是在定义时被确定
    • 在方法的参数中传入函数时也需要特别注意,传入函数的 this 也指向其方法被调用的上一级对象
  • 显示绑定
    • 使用了bind()方法来显式修改this的指向,与bind()方法有类似功能的还有call()方法和apply()方法
  • new绑定
    • 如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么 this 还是指向函数的实例
  • 在箭头函数中,this指向函数声明时所在作用域下的this的值
  • 在事件处理程序中,this绑定到放置侦听器的元素

默认绑定

Global

在全局执行上下文中,this指的是全局对象

console.log(this === window); // true

Function

如果不在严格模式下,则函数this引用全局对象

function f() {
  return this;
}

console.log(f() === window); // true

当在严格模式下,一个函数的this将是undefined,但显示的用window调用除外

'use strict';

function f() {
  return this;
}

console.log(f()); // undefined
console.log(window.f() === window); // true

隐式绑定

function f() {
    console.log(this.a);
}
var obj = {
    a: 2,
    f: f,
};
var obj1 = {
    a: 3,
    obj: obj,
};
var func = obj.f;
var a = "Global";

function doFunc(fn) {
    fn();
}
    
obj.f(); // 2  // 如果一个函数中有this,这个函数又被上一级的对象所调用,那么this指向的就是上一级的对象
obj1.obj.f(); // 2  // this指向的是被调用方法的上一级对象,而不是它的最外层对象
func(); // Global  //  this 是在运行时被确定,而不是在定义时被确定
doFunc(obj.f); // Global  // 在方法的参数中传入函数时也需要特别注意,传入函数的this也指向其方法被调用的上一级对象

显示绑定

使用了bind()方法来显式修改this的指向

function f() {
    console.log(this.a);
}
var obj = {
    a: 2,
    f: f,
};
var a = "Global";

setTimeout(obj.f.bind(obj), 100); // 2

new绑定

如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么 this 还是指向函数的实例

function fn() {
    this.user = "Tom";
    return 1; //或 return undefined
}
var fun = new fn();
console.log(fun.user); // Tom

function fn() {
    this.user = "Tom";
    return {}; //或 return function(){}
}
var fun = new fn();
console.log(fun.user); // undefined

箭头函数中的this

this是静态的,始终指向函数声明时所在作用域下的this的值,call()和apply()都不能改变指针的指向

function who() {
    console.log(this.name);
}

let who1 = () => {
    console.log(this.name);
};

window.name = "Tom";

const name1 = {
    name: "Jerry",
};
//直接调用
who(); // Tom
who1(); // Tom
    
//使用call()
who.call(name1); // Jerry
who1.call(name1); // Tom

事件处理程序中的this

this绑定到放置侦听器的元素

const el = document.getElementById('my-el');

el.addEventListener('click', function() {
  console.log(this === el); // true
});

==================================

此为个人学习记录文章,如有错误请指出
欢迎小伙伴前来交流,如有转载请注明出处,谢谢
每一个努力的人都值得被肯定,但是最大的肯定来源于自己!!!
加油每一天!!!