5



在查看 Mozilla 文档中的 ES6 箭头函数文档时,我了解到箭头函数应用了严格模式的所有规则,除了链接中描述的规则

  var f = () => { 'use strict'; return this};
    var g = function () { 'use strict'; return this;}

    console.log(f()); //prints Window
    console.log(g()); // prints undefined

    //we can test this in firefox!

但是,Babel.js将箭头函数代码转换为返回undefined而不是Window演示链接)的 ES5 代码

"use strict";

setTimeout(function () {
  return undefined;
}, 100);

所以,上面的代码片段是 Babel.js 的输出。不能是下面的输出吗?

"use strict";

setTimeout(function () {
  return this;
}.bind(Window), 100);

如果我正在编写 ES6,我会期待Window而不是undefined
它是一个错误吗?
或者,我误解了什么?

4

2 回答 2

6

tl;dr: Babel 假设每个文件都是一个模块。模块默认是严格this的,它们的值为undefined.


这在Babel FAQ中有介绍:

Babel 假设所有输入代码都是一个 ES2015 模块。ES2015 模块是隐式严格模式,因此这意味着顶级this不在window浏览器中,也不exports在节点中。

如果您不想要这种行为,那么您可以选择禁用严格的转换器:

$ babel --blacklist strict script.js

require("babel").transform("code", { blacklist: ["strict"] });

请注意:如果您这样做,您愿意偏离规范,这可能会导致未来的互操作问题。

有关更多信息,请参阅严格的变压器文档

于 2015-06-09T04:54:47.320 回答
2

MDN所述,您原则上是正确的。但是,Babel 总是将 a'use strict'放在根范围内。实际上,您编译以下内容:

'use strict';
var f = () => { 'use strict'; return this};

在这种情况下,严格的规则确实适用。请参阅此处的编译示例。Babel 甚至优化了顶层,this因为它保证是undefined.

于 2015-06-08T09:40:06.967 回答