为什么 ES6 IIFE 和 ES5 IIFE 的执行上下文不同?

Why is the execution context of ES6 IIFEs and ES5 IIFEs different?

标题总结了问题 - 这是代码示例:

!function() {
    console.log(this); // global object
}();

(function() {
    console.log(this); // global object
})();

() => {
    console.log(this); // {}
}();

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

箭头函数的幕后发生了什么?如果我想在 ES5 中使用该范围,据我所知,我必须将执行绑定到一个空的 object,如下所示:

!function() {
    console.log(this); // global object
}.bind({})();

这与 ES5 或 ES6 无关,箭头函数总是获取封闭函数的上下文。不使用 'use strict'; 的函数调用总是获取全局对象作为上下文(例如浏览器中的 window),使用时,上下文默认为 undefined

这是一篇解释主题的非常好的文章:

https://rainsoft.io/gentle-explanation-of-this-in-javascript/