面试题:this指向

2024-01-07 16:10:59

this是一个在运行时才进行绑定的引用,在不同的情况下它可能会被绑定不同的对象。

this关键字由来

在对象内部的方法中使用对象内部的属性是一个非常普遍的需求。但是JavaScript的作用域机制并不支持这一点,基于这个需求,JavaScript又搞出来另外一套this机制。

this在什么时候确定下来

this和作用域不一样,作用域是声明的时候就定下来了,this是在调用的时候才确定下来

this存在场景

  1. 全局执行上下文

    在全局执行环境中无论是否在严格模式下,(在任何函数体外部)this 都指向全局对象.

    当普通函数在执行时,如果是严格模式,内部的this指向undefined,如果非严格模式,内部的this指向Window对象。

  2. 函数执行上下文

    在函数执行上下文中访问this,函数的调用方式决定了 this 的值。在全局环境中调用一个函数,函数内部的 this 指向的是全局变量 window,通过一个对象来调用其内部的一个方法,该方法的执行上下文中的 this 指向对象本身。

  3. eval执行上下文

this绑定方式

  1. 默认绑定

  2. 隐式绑定

  3. 显示绑定

通过call、apply、bind方式,调用,如果第一个参数是undefined、null时,里面的this指向window,如果是普通变量时,现转化成对象,this指向这个对象

  1. new绑定

  2. 箭头函数绑定

箭头函数内部没有this,因此不能做构造函数 箭头函数没有prototype,也没有arguments 箭头函数并不会创建其自身的执行上下文,所以箭头函数中的 this 取决于它的外部函数

首先,箭头函数不会创建自己的 this,它只会从自己的作用域链上找父级执行上下文的 this,而不是谁调用它,它的 this 就是谁。所以箭头函数中的 this,取决于你上层执行上下文的 this 。

var abc = {
    getNum: () => {
        console.log(this); // Window
    }
}
abc.getNum();
const sum = () => {
    console.log(this); // Window
}
sum();

目录

相关推荐
display为inline-block的元素中间有间隙的原因和解决办法面试题:new关键字做了什么深入理解JS预解析(变量提升和函数提升)引用计数算法闭包