这个箭头函数的值用作函数表达式或对象的方法

时间:2017-04-28 13:06:29

标签: javascript ecmascript-6 this arrow-functions

关于arrow functions的另一个主题和这个值,但我找不到令我困惑的代码的答案。

当我在浏览器的控制台中运行此代码时,结果为true:

var f = () => { return this; };
f() === window;                // true
f()                            // Window

但是当我在Node中运行相同的代码时,会得到不同的结果:

var f = () => { return this; };
console.log(f() === global);    // false
console.log(f() === undefined); // false
console.log(f());               // {}

当定义一个对象时:

let button = {
    isClicked: false,
    click: () => { this.isClicked = true }
}

console.log(button.isClicked);   // false
button.click();
console.log(button.isClicked);   // false

在Node中执行此行时,结果未定义:

console.log(global.isClicked);   // undefined

但是在浏览器中执行时,结果为真:

console.log(window.isClicked);    // true

为什么在浏览器中执行代码时这指的是窗口对象但是在Node中执行时这不是指全局?

1 个答案:

答案 0 :(得分:2)

  

但是当我在Node中运行相同的代码时,会得到不同的结果:

右。 Node中的代码不在全局范围内运行,它在为Node"模块"创建的范围内运行。其中this没有引用全局对象,它指的是模块的导出(又名module.exports)。有关节点模块here的更多信息。

  

同样定义对象时

this在对象初始值设定项中不具有不同的含义。您的示例代码:

let button = {
    isClicked: false,
    click: () => { this.isClicked = true }
};

...正在执行此代码所做的事情:

let button = {
    isClicked: false
};
button.click = () => { this.isClicked = true };

在这两种情况下,click功能都会关闭this,因为它是我们创建button的地方。 this在初始值设定项中没有改变含义,但该代码假设它(特别是,代码假设this成为对正在创建的对象的引用,它没有;实际上,有no way来引用从初始化程序中创建的对象。

(在这种特殊情况下最简单的解决方案是使用button而不是this,因为该函数也会关闭button。)