首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确定“严格”和“非严格”模式的规则箭头fn中正确的‘the’?

如何确定“严格”和“非严格”模式的规则箭头fn中正确的‘the’?
EN

Stack Overflow用户
提问于 2020-05-12 18:16:23
回答 1查看 40关注 0票数 2

对于下面的代码片段

案例1:严格模式

代码语言:javascript
运行
复制
"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

产出如下:

代码语言:javascript
运行
复制
{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:非严格模式

相同的片段将输出

代码语言:javascript
运行
复制
{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 --当函数作为对象的方法被调用时,它被设置为方法称为on.
  • call 2的对象--不管是什么,arrowMethod--它被设置为创建它时的值(在上面的示例中,是全局object).
  • call 3 )--如果在输入执行上下文时没有设置该方法的值,则不管是什么,arrowMethod的值都设置为创建时的值(在上面的示例中),(

)

在非严格的模式下,

  • call 1 --当一个函数作为对象的方法被调用时,它被设置为这个方法称为on.
  • call 2的对象--不管是什么,arrowMethod--它被设置为创建它时的值(在上面的示例中,是全局object).
  • call 3 )--因为代码不是处于严格模式,而且由于调用没有设置这个方法的值,这将默认为全局对象,它是browser.
  • call 4中的一个窗口--不管发生什么,arrowMethod--这被设置为创建时的样子(在上面的示例中,是全局对象)。

问题

  • 不像Case 1: Strict mode中的call 4,因为在创建箭头fn时没有设置它的值,所以它始终没有定义?

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-12 18:27:03

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

重要的是,定义它们的函数是否使用严格模式,因为箭头函数的值来自于:

代码语言:javascript
运行
复制
 function strictMake() {
     "use strict";
     return () => { console.log(this == window); };
 }
 function sloppyMake() {
     return () => { console.log(this == window); };
 }

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

 arrowFromStrict();
 arrowFromSloppy();

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61759089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档