javascript - 如何使用 `this` 和 "strict"模式确定常规箭头 fn 内正确的 "non-strict"?

标签 javascript object methods this arrow-functions

对于下面的代码片段

情况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 - 当函数作为对象的方法被调用时,this 将设置为调用该方法的对象。
  • call 2 - 无论如何,arrowMethod 的 this 都会设置为创建时的值(在上面的示例中为全局对象)。
  • call 3 - 如果在进入执行上下文时未设置此值,则它保持未定义状态。
  • call 4 不管怎样,arrowMethod 的 this 都会被设置为它被创建时的值(在上面的例子中,全局对象)。

在非严格模式下,

  • call 1 - 当函数作为对象的方法被调用时,this 将设置为调用该方法的对象。
  • call 2 - 无论如何,arrowMethod 的 this 都会设置为创建时的值(在上面的示例中为全局对象)。
  • call 3 - 由于代码不是严格模式,并且 this 的值不是由调用设置的,因此 this 将默认为全局对象,即浏览器中的一个窗口.
  • call 4 - 无论如何,arrowMethod 的 this 都会设置为创建时的值(在上面的示例中为全局对象)。

问题

  • 情况 1:严格模式中的call 4不同,因为创建箭头 fn 时未设置此值,所以它始终保持未定义状态?

    or

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

最佳答案

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

可能重要的是它们定义的函数是否使用严格模式,因为箭头函数从中获取其值:

 function strictMake() {
     "use strict";
     return () => { console.log(this == window); };
 }
 function sloppyMake() {
     return () => { console.log(this == window); };
 }

 const arrowFromStrict = strictMake();
 const arrowFromSloppy = sloppyMake();

 arrowFromStrict();
 arrowFromSloppy();

关于javascript - 如何使用 `this` 和 "strict"模式确定常规箭头 fn 内正确的 "non-strict"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61759089/

相关文章:

java - 另一个类中的 Get 和 Set 方法

javascript - 如何从 JSON 对象中获取字符串

javascript - 如何在脚本标签内使用html编码的xss攻击向量触发xss?

class - PYGAME - 使一个对象旋转到自动生成的对象

java - 无法从方法 (Java) 获得正确的 boolean 值输出

python - 静态方法和递归?

javascript - 使图像标题在图像下方滑动?

Javascript:循环遍历保存数组的对象数组

javascript - 如何从嵌套的对象数组中获取每个父级的值

java - 通过复制构造函数在 Java 中复制对象而不影响原始对象