如何在具有“严格”和“非严格”模式的常规箭头fn中确定正确的“ this”?

问题描述 投票:2回答:1

对于下面的代码段

情况1:严格模式

"use strict"

let obj = {
  method: function(){
    console.log(this);
  },
  arrowMethod: () => {
    console.log(this);
  }
};

obj.method(); // call 1
obj.arrowMethod(); // call 2

let method = obj.method;
let arrowMethod = obj.arrowMethod;

method(); // call 3
arrowMethod(); // call 4

输出为:

{method: ƒ, arrowMethod: ƒ}
Window {parent: Window, opener: null, top: Window, length: 1, frames: Window, …}
undefined
Window {parent: Window, opener: null, top: Window, length: 1, frames: Window, …}

情况2:非严格模式

将输出相同的代码段

{method: ƒ, arrowMethod: ƒ}
Window {parent: Window, opener: null, top: Window, length: 1, frames: Window, …}
Window {parent: Window, opener: null, top: Window, length: 1, frames: Window, …}
Window {parent: Window, opener: null, top: Window, length: 1, frames: Window, …}

我的理解是:

在严格模式下,

  • [call 1-将函数作为对象的方法调用时,将其设置为调用该方法的对象。
  • call 2-不管怎样,arrowMethod的设置为创建时的状态(在上面的示例中是全局对象)。
  • [call 3-如果在进入执行上下文时未设置此值,则其值未定义。
  • call 4无论如何,arrowMethod的参数设置为创建时的状态(在上面的示例中是全局对象)。

在非严格模式下,

  • [call 1-将函数作为对象的方法调用时,将其设置为调用该方法的对象。
  • call 2-不管怎样,arrowMethod的设置为创建时的状态(在上面的示例中是全局对象)。
  • [call 3-由于代码不是处于严格模式下,并且由于未通过调用设置其值,因此它将默认为全局对象,它是浏览器中的窗口。]
  • call 4-不管怎样,arrowMethod的设置为创建时的状态(在上面的示例中是全局对象)。
  • 问题

  • call 4中的Case 1: Strict mode不同,由于在创建箭头fn时未设置其值,因此始终保持未定义状态吗?

  • 严格模式是否不适用于箭头fns,因此在创建箭头fn时将其设置为窗口对象?

对于下面的代码片段,情况1:严格模式“ use strict” let obj = {method:function(){console.log(this); },arrowMethod:()=> {console.log(this); }; obj.method(); // ...

javascript object methods this arrow-functions
1个回答
1
投票

是的,严格模式函数的默认规则不是默认从undefined到全局对象,因此不适用于箭头函数,因为它们根本没有自己的this。它始终是外部示波器的this值。在您的示例中就是window

© www.soinside.com 2019 - 2024. All rights reserved.