MST

星途 面试题库

面试题:JavaScript 中定时器内this指向问题

在JavaScript中,以下代码中定时器内的this指向什么?为什么?如何修改让它指向obj对象? ```javascript const obj = { name: 'test', printName: function() { setTimeout(function() { console.log(this.name); }, 1000); } }; obj.printName(); ```
48.2万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 定时器内的this指向
    • 在上述代码中,定时器setTimeout内的this指向全局对象(在浏览器环境下是window,在Node.js环境下是global)。
    • 原因是在JavaScript中,函数内部的this指向取决于函数的调用方式。setTimeout的回调函数是作为普通函数调用的,普通函数调用时,this指向全局对象(非严格模式下)。在严格模式下,普通函数调用时thisundefined。这里代码没有开启严格模式,所以this指向全局对象。
  2. 修改让它指向obj对象的方法
    • 使用bind方法
const obj = { 
    name: 'test', 
    printName: function() { 
        setTimeout(function() { 
            console.log(this.name); 
        }.bind(this), 1000); 
    } 
}; 
obj.printName();
  • 使用箭头函数
const obj = { 
    name: 'test', 
    printName: function() { 
        setTimeout(() => { 
            console.log(this.name); 
        }, 1000); 
    } 
}; 
obj.printName();
  • 在外部保存this
const obj = { 
    name: 'test', 
    printName: function() { 
        const self = this;
        setTimeout(function() { 
            console.log(self.name); 
        }, 1000); 
    } 
}; 
obj.printName();