在javascript中使用严格不适用于胖箭头?

Posted

技术标签:

【中文标题】在javascript中使用严格不适用于胖箭头?【英文标题】:use strict in javascript not working for fat arrow? 【发布时间】:2016-07-25 11:35:04 【问题描述】:

我发现了一个有趣的案例,其中“使用严格”在 javascript 中没有按预期工作。 以下功能

"use strict";

var y = () => 
    console.log(this);


var x = function () 
    console.log(this);


x(); // undefined due to use strict
y(); // window object

我认为胖箭头上下文也应该被 undefined 覆盖,还是我的假设有误?

【问题讨论】:

由于您在全局范围内执行此操作(其中thiswindow 对象),并且箭头函数中的this 是词法,我看不出这有什么意外? 【参考方案1】:

MDN 谈到arrow functions:

与严格模式的关系

鉴于this 是词法,关于this 的严格模式规则将被忽略。

var f = () => 'use strict'; return this;
f() === window; // or the global object

词法规则this 优先于严格模式this 规则。

通过检查a function's [[ThisMode]] slot 的可能值(可以是lexicalstrictglobal)的简单英文描述,我们可以在 ES2015 规范中轻松看到这一点:

定义this 引用在函数的形式参数和代码主体中的解释方式。 lexical 表示 this 指的是词法封闭函数的 this 值。 strict 表示 this 值完全按照函数调用所提供的方式使用。 global 表示 this 的值 undefined 被解释为对全局对象的引用。

换句话说,函数的this 行为可以是严格的、非严格的或词法的。如果函数的 [[ThisMode]] 是词法的(就像箭头函数一样),它会使函数的严格/非严格状态与确定 this 设置行为的目的无关。

【讨论】:

以上是关于在javascript中使用严格不适用于胖箭头?的主要内容,如果未能解决你的问题,请参考以下文章

全栈之路-前端javascript基础知识4

如何在 CoffeeScript 胖箭头回调中引用实际的“this”?

使用胖箭头(放屁)语法定义函数时,vim中的JSlint错误

猫头鹰轮播导航箭头不适用于 WordPress

如果在胖箭头函数内

CoffeeScript:如何同时使用胖箭头和 this?