// 六种语言中的简单函数示例function (a) { return a > 0; } // JS [](int a) { return a > 0; } // C++ (lambda (a) (> a 0)) ;; Lisp lambda a: a > 0 # Python a => a > 0 // C# a -> a > 0 // Java
箭袋中的新羽
ES6中引入了一种编写函数的新语法
// ES5 var selected = allJobs.filter(function (job) { return job.isSelected(); }); // ES6 var selected = allJobs.filter(job => job.isSelected());
当你只需要一个只有一个参数的简单函数时,可以使用新标准中的箭头函数,它的语法非常简单:标识符=>表达式
。你无需输入function
和return
,一些小括号、大括号以及分号也可以省略。
(我个人对于这个特性非常感激,不再需要输入function
这几个字符对我而言至关重要,因为我总是不可避免地错误写成functoin
,然后我就不得不回过头改正它。)
那么不是非常函数化的情况又如何呢?除表达式外,箭头函数还可以包含一个块语句。回想一下我们之前的示例:
// ES5 $("#confetti-btn").click(function (event) { playTrumpet(); fireConfettiCannon(); });
这是它们在ES6中看起来的样子:
// ES6 $("#confetti-btn").click(event => { playTrumpet(); fireConfettiCannon(); });
这是一个微小的改进,对于使用了的代码来说箭头函数的效果可以变得更加戏剧性,}).then(function (result) {
这样的一行代码可以堆积起来。
注意,使用了块语句的箭头函数不会自动返回值,你需要使用return
语句将所需值返回。
小提示:当使用箭头函数创建普通对象时,你总是需要将对象包裹在小括号里。
// 为与你玩耍的每一个小狗创建一个新的空对象 var chewToys = puppies.map(puppy => { }); // 这样写会报Bug! var chewToys = puppies.map(puppy => ({ })); //
用小括号包裹空对象就可以了。
不幸的是,一个空对象{}
和一个空的块{}
看起来完全一样。ES6中的规则是,紧随箭头的{被解析为块的开始,而不是对象的开始。因此,puppy => {}
这段代码就被解析为没有任何行为并返回undefined
的箭头函数。
更令人困惑的是,你的JavaScript引擎会将类似{key: value}
的对象字面量解析为一个包含标记语句的块。幸运的是,{
是唯一一个有歧义的字符,所以用小括号包裹对象字面量是唯一一个你需要牢记的小窍门。