• 【面试题】说说JS中的this指向问题


    JS中的this指向问题

    this的指向问题

    全局作用域

    在JS中,全局的变量和函数附着在global对象上,全局对象在浏览器环境下是window对象。

    • 在全局作用域中,this指向全局对象window
    1. console.log(this); // window对象
    2. console.log(window); // window对象
    3. console.log(this === window); // true
    1. var a = 3;
    2. console.log(a);                                 // 3
    3. console.log(window.a); // 3
    4. console.log(this.a); // 3
    5. console.log(a === window.a && window.a === this.a); // true
    1. function say(){
    2. console.log("hi");
    3. }
    4. this.say(); // hi

    全局变量和window对象的关系

    • 使用var声明定义的全局变量被挂载到全局对象window上。

    • 使用letconst声明定义的全局变量不会被挂载到全局对象window上。


    普通函数

    普通函数内部的this指向调用这个函数的对象。

    案例1

    1. function testThis(){
    2. console.log(this);
    3. }
    4. testThis(); // 输出结果: window对象

    testThis()在全局作用域中被调用,相当于执行了window.testThis();,则函数被调用时,内部的this指向window.

    案例2

    1. var obj = {
    2. test(){
    3. console.log(this);
    4. }
    5. }
    6. obj.test(); // obj

    普通函数作为对象上的方法时,this指向调用方法的对象.

    案例3

    1. var obj = {
    2. test1(){
    3. console.log(this);
    4. },
    5. test2(){
    6. test(); // 这里相当于执行了window.test();
    7. }
    8. }
    9. function test(){
    10. console.log(this);
    11. }
    12. obj.test1(); // obj
    13. obj.test2(); // window
    14. test(); // window

    构造函数

    构造函数一般是通过new关键字调用的,其内部的this指向新创建的对象。

    1. function Person(name,age){
    2. this.name = name;
    3. this.age = age;
    4. console.log(this);
    5. }
    6. const person1 = new Person('张三',20);
    7. const person2 = new Person('李四',18);

    构造函数利用指向新对象的this,将传入的nameage属性直接赋值给新对象。通过最后的console.log(this)语句也可以检测出this的指向。


    绑定事件函数

    1. const btn = document.querySelector('button');
    2. btn.onclick = function(){
    3. console.log(this);
    4. }
    • this指向触发该事件的对象。

    此处,点击事件触发时,this指向按钮这个DOM对象。


    箭头函数

    箭头函数没有属于自己的this。因此,箭头函数内部使用的this就是箭头函数所在上下文的this.

    1. var obj = {
    2. test1(){
    3. console.log(this);
    4. },
    5. test2:()=>{
    6. console.log(this);
    7. }
    8. }
    9. obj.test1(); // obj
    10. obj.test2(); // window

    test2是箭头函数,没有属于自己的this。在其内部输出的thisobj所在上下文的this,即window


    改变this指向的方法

    函数是对象,有属于自己的属性和方法。

    函数有callapply方法可以改变调用时this的指向。

    给大家推荐一个实用面试题库

    1、前端面试题库 (面试必备)            推荐:★★★★★

    地址:前端面试题库

  • 相关阅读:
    原型工具墨刀的使用
    一种基于双MCU协同的多功能押解脚环
    【微信小程序】welcome页面
    千峰商城-springboot项目搭建-84-订单提交及支付-显示支付结果(websocket代码实现)...
    float、double类型的转化和判断为零问题
    拓扑排序(一部分)
    支付官方解析
    STM32F10x SPL V3.6.2 集成 FreeRTOS v202112
    彻底搞懂kubernetes调度框架与插件
    sql:SQL优化知识点记录(十四)
  • 原文地址:https://blog.csdn.net/weixin_42981560/article/details/127663654