es6的箭头函数,顾名思义箭头函数是使用一个箭头( => )来定义的函数,这很容易理解可是它有不少行为与传统的js函数不一样:node
var reflect = value => value; // 有效等价于: var reflect = function(value) { return value; };
函数须要传入多个参数:es6
var sum = (num1, num2) => num1 + num2; // 有效等价于: var sum = function(num1, num2) { return num1 + num2; };
若是函数没有任何参数,那么在声明时就必须使用一对空括号,就像这样:浏览器
var getName = () => "Nicholas"; // 有效等价于: var getName = function() { return "Nicholas"; };
你基本能够将花括号内部的代码当作传统函数那样对待,除了 arguments 对象不可用以外。
若你想建立一个空函数,就必须使用空的花括号,就像这样:闭包
var doNothing = () => {}; // 有效等价于: var doNothing = function() {};
花括号被用于表示函数的主体,它在你至今看到的例子中都工做正常。但若箭头函数想要从
函数体内向外返回一个对象字面量,就必须将该字面量包裹在圆括号内,例如:app
var getTempItem = id => ({ id: id, name: "Temp" }); // 有效等价于: var getTempItem = function(id) { return { id: id, name: "Temp" }; };
JS 最多见的错误领域之一就是在函数内的 this 绑定。因为一个函数内部的 this 值能够
被改变,这取决于调用该函数时的上下文,所以彻底可能错误地影响了一个对象,尽管你本
意是要修改另外一个对象。
箭头函数没有 this 绑定,意味着箭头函数内部的 this 值只能经过查找做用域链来肯定。
若是箭头函数被包含在一个非箭头函数内,那么 this 值就会与该函数的相等;不然,
this 值就会是全局对象(在浏览器中是 window ,在 nodejs 中是 global )。函数
尽管箭头函数没有本身的 arguments 对象,但仍然能访问包含它的函数的 arguments 对
象。不管此后箭头函数在何处执行,该对象都是可用的。例如:优化
function createArrowFunctionReturningFirstArg() { return () => arguments[0]; } var arrowFunction = createArrowFunctionReturningFirstArg(5); console.log(arrowFunction()); // 5
然函数的 this 绑定并不会受影响。这里有几个例子:this
var sum = (num1, num2) => num1 + num2; console.log(sum.call(null, 1, 2)); // 3 console.log(sum.apply(null, [1, 2])); // 3 var boundSum = sum.bind(null, 1, 2); console.log(boundSum()); // 3
在 ES6 中对函数最有趣的改动或许就是一项引擎优化,它改变了尾部调用的系统。尾调用(
tail call )指的是调用函数的语句是另外一个函数的最后语句,就像这样:prototype
function doSomething() { return doSomethingElse(); // 尾调用 }
在 ES5 引擎中实现的尾调用,其处理就像其余函数调用同样:一个新的栈帧( stack frame
)被建立并推到调用栈之上,用于表示该次函数调用。这意味着以前每一个栈帧都被保留在内
存中,当调用栈太大时会出问题。code
那何时不会被优化呢/
"use strict"; function doSomething() { // 未被优化:缺乏 return doSomethingElse(); }
"use strict"; function doSomething() { // 未被优化:在返回以后还要执行加法 return 1 + doSomethingElse(); }
"use strict"; function doSomething() { // 未被优化:调用并不在尾部 var result = doSomethingElse(); return result; }
本例之因此不能被优化,是由于 doSomethingElse() 的值并无当即被返回。
"use strict"; function doSomething() { var num = 1, func = () => num; // 未被优化:此函数是闭包 return func(); }
"use strict";
function doSomething() {
var num = 1,
func = () => num;
// 未被优化:此函数是闭包
return func();
}
此例中闭包 func() 须要访问局部变量 num ,虽然调用 func() 后当即返回了其结果,但 是对于 num 的引用致使优化不会发生.