在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 覆盖,还是我的假设有误?
【问题讨论】:
由于您在全局范围内执行此操作(其中this
是window
对象),并且箭头函数中的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 的可能值(可以是lexical
、strict
或global
)的简单英文描述,我们可以在 ES2015 规范中轻松看到这一点:
定义
this
引用在函数的形式参数和代码主体中的解释方式。lexical
表示this
指的是词法封闭函数的this
值。strict
表示this
值完全按照函数调用所提供的方式使用。global
表示this
的值undefined
被解释为对全局对象的引用。
换句话说,函数的this
行为可以是严格的、非严格的或词法的。如果函数的 [[ThisMode]]
是词法的(就像箭头函数一样),它会使函数的严格/非严格状态与确定 this
设置行为的目的无关。
【讨论】:
以上是关于在javascript中使用严格不适用于胖箭头?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 CoffeeScript 胖箭头回调中引用实际的“this”?