在Javascript中,等于和大于符号(=>)是什么意思?

6
在 Meteor 的 Whatsapp 示例项目中,有一个文件使用了 "=>" 这个语法,但我的 WebStorm IDE 将其视为错误。我找不到任何关于这个语法的文档。
chats.forEach( chat => {
  let message = Messages.findOne({ chatId: { $exists: false } });
  chat.lastMessage = message;
  let chatId = Chats.insert(chat);
  Messages.update(message._id, { $set: { chatId: chatId } })
});

这里是bootstrap.js文件的GitHub仓库

"=>"是什么意思?


6
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions - elclanrs
1
这是一个 JavaScript Lambda 函数。请查看此链接:http://www.codeproject.com/Tips/729737/JavaScript-Lambda-Expressions - ChaseHardin
2个回答

6

我原本想要给这个问题点个踩,但是如果你不知道它被称为什么,那么通过谷歌搜索答案会变得出奇的困难。正如评论中的链接所示,那是一个箭头函数(有时也称为箭头函数)。

箭头函数有一些令人困惑的方面,因此我将介绍一些要点:

普通函数根据上下文设置this指针:使用new调用的函数将其设置为新创建的对象,作为方法调用的函数将其绑定到调用该方法的对象,否则将其绑定到undefined或全局对象(取决于“严格模式”编译指示符),当然也可以使用Function.prototype.bind等进行设置。

但是箭头函数没有由运行时创建的this指针绑定(也无法通过Function.prototype.bind指定),这意味着它通过作用域链解析就像任何其他变量一样进行词法查找。 MDN文章在这一点上最多略微令人困惑(请参见上面的链接)。

此外,箭头函数具有隐式返回,返回值将自动成为函数体中最后计算的表达式。

箭头函数没有 arguments 伪数组。你可以使用 ES6 的 rest 参数代替。
对于参数个数为 1 的函数,可以省略参数周围的括号。

虽然可能会导致错误,但它可以在任何支持本地箭头函数的环境中获取全局对象。我不认为这是正确的。正如你所说,由于“this”是词法解析的,因此只有当当前环境中的“this”已经解析为全局对象时,才能获得全局对象。例如:function foo() { 'use strict'; let _global = (() => { return this })(); }; foo();将把_global设置为undefined - Felix Kling
@FelixKling 我不知道有哪些环境中,非严格模式下顶层函数中的 this 不引用该环境中的全局对象(对于该环境来说)。严格模式才是问题所在,而据我所知这也是 System.global 提案的原因。https://github.com/tc39/proposal-global - Jared Smith
等一下,你是不是指 let _global = (() => { return this })(); 在全局作用域中执行?"严格模式是问题所在" 嗯,在全局作用域中,无论是否启用严格模式,this 总是指向全局对象。这与箭头函数无关。 - Felix Kling
正确。像那样在函数内部定义它显然会使它变成undefined,因为this被设置为作用域链中更高的未定义值,但是如果严格模式指示符全局设置(比如说,在另一个文件中),我概述的方法应该仍然有效。 - Jared Smith
但是,由于箭头函数内部的this将解析为该函数在环境中定义(并在此情况下执行)的任何值,因此您可以只需执行let _global = this;。也许不使用this会更清晰:let x = 42; let y = (() => { return x })();let x = 42; let y = x;相同。 - Felix Kling
@FelixKling 你说得对,我会修复的。 - Jared Smith

2

这是一个 ES6箭头函数。如果您切换到WebStorm的设置:

enter image description here

您可以像图片所示切换JavaScript版本为ECMAScript 6,以使WebStorm正确识别它们。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接