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

时间:2016-04-05 13:31:56

标签: javascript ecmascript-6 use-strict

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

"use strict";

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

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

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

我认为胖箭头上下文也应该被未定义覆盖,或者我的假设是错误的?

1 个答案:

答案 0 :(得分:9)

MDN说arrow functions

  

与严格模式的关系

     

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

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

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

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

  

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

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