箭头函数与setTimeout作用域测试结果与教程结论相悖的疑问
setTimeout中箭头函数与普通函数的this指向争议
我正在学习JavaScript教程,教程里说不应在setTimeout中使用箭头函数,理由是箭头函数会指向window作用域而非封闭作用域。但我的测试结果刚好相反:命名函数指向window,箭头函数却能正确指向目标对象。
测试代码
const dude = { name: 'dude', namedFunc() { console.log('name 1: ', this.name); // Dude setTimeout(function() { console.log('this 1:', this); console.log('name 2:', this.name); // undefined }, 200); }, arrowFunc() { console.log('name 3:', this.name); // Dude setTimeout(() => { console.log('this 2:', this); // {name: 'dude', nameWNamed: ƒ, nameWArrow: ƒ} console.log('name 4:', this.name); // Dude }, 300) } } console.log('namedFunc:', dude.namedFunc()); // Dude console.log('arrowFunc:', dude.arrowFunc()); // Dude
教程给出的预期输出
this 1: {name: 'dude', namedFunc: ƒ, arrowFunc: ƒ} name 2: dude this 2: Window {window: Window, self: Window, document: document, name: '', location: Location, …} name 4:
我的实际输出
this 1: Window {window: Window, self: Window, document: document, name: '', location: Location, …} name 2: this 2: {name: 'dude', namedFunc: ƒ, arrowFunc: ƒ} name 4: dude
内容的提问来源于stack exchange,提问作者Luis Aguiar
相关产品推荐
相关产品推荐

