您的位置:首页 > 其它

ES6--函数

2016-01-14 10:51 176 查看
默认参数

定义函数的时候指定参数的默认值了

function sayHello(name){
//传统的指定默认参数的方式
var name = name||'hubwiz';
document.write('Hello '+name);
}

//运用ES6的默认参数
function sayHello2(name='hubwiz'){
document.write(`Hello ${name}`);
}
sayHello();  //输出:Hello hubwiz
sayHello('汇智网');  //输出:Hello 汇智网
sayHello2();  //输出:Hello hubwiz
sayHello2('汇智网');  //输出:Hello 汇智网


rest参数

rest参数(形式为“…变量名”)可以称为不定参数,用于获取函数的多余参数,这样就不需要使用

arguments对象了。

rest参数搭配的变量是一个数组,该变量将多余的参数放入数组中。

不定参数的格式是三个句点后跟代表所有不定参数的变量名。比如以上示例中,...values 代表了所有传入add函数的
参数。
function add(...values) {
let sum = 0;

for (var val of values) {
sum += val;
}

return sum;
}

add(1, 2, 3) // 6


扩展运算符 传递函数参数

扩展运算符(spread)是三个点(…)。它好比rest参数的逆运算,将一个数组转为用逗号分隔的参数序

列。该运算符主要用于函数调用。

它允许传递数组或者类数组直接做为函数的参数而不用通过apply。

var people=['张三','李四','王五'];

//sayHello函数本来接收三个单独的参数people1,people2和people3
function sayHello(people1,people2,people3){
document.write(`Hello ${people1},${people2},${people3}`);
}

//但是我们将一个数组以拓展参数的形式传递,它能很好地映射到每个单独的参数
sayHello(...people);   //输出:Hello 张三,李四,王五

//而在以前,如果需要传递数组当参数,我们需要使用函数的apply方法
sayHello.apply(null,people);   //输出:Hello 张三,李四,王五


箭头函数

var array = [1, 2, 3];
//传统写法
array.forEach(function(v, i, a) {
document.write(v);
});
//ES6
array.forEach(v => document.write(v));

它们同时支持表达式体和语句体。与(普通的)函数所不同的是,箭头函数和其上下文中的代码共享同一个具有词法作用
域的this。
var evens = [1,2,3,4,5];
var fives = [];
// 表达式体
var odds = evens.map(v => v + 1);
var nums = evens.map((v, i) => v + i);
var pairs = evens.map(v => ({even: v, odd: v + 1}));

// 语句体
nums.forEach(v => {
if (v % 5 === 0)
fives.push(v);
});

document.write(fives);

// 具有词法作用域的 this
var bob = {
_name: "Bob",
_friends: ["Amy", "Bob", "Cinne", "Dylan", "Ellen"],
printFriends() {
this._friends.forEach(f =>
document.write(this._name + " knows " + f));//this:为bob对象,而不是正在使用的对象
}
}

bob.printFriends();

箭头函数有几个使用注意点。
1.函数体内的this对象,绑定定义时所在的对象,而不是使用时所在的对象。
2.不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
3.不可以使用arguments对象,该对象在函数体内不存在。


函数绑定

函数绑定运算符是并排的两个双引号(::),双引号左边是一个对象,右边是一个函数。该运算符会自动将左

边的对象,作为上下文环境(即this对象),绑定到右边的函数上面。

let log = ::console.log;
// 等同于
var log = console.log.bind(console);

foo::bar;
// 等同于
bar.call(foo);

foo::bar(...arguments);
i// 等同于
bar.apply(foo, arguments);


尾调用优化

什么是尾调用?

尾调用的概念非常简单,一句话就能说清楚,就是指某个函数的最后一步是调用另一个函数。

“尾调用优化”(Tail call optimization),即只保留内层函数的调用帧,这样可以节省内存。

function f(x){
return g(x);
}
函数f的最后一步是调用函数g,这就叫尾调用。

尾调用由于是函数的最后一步操作,所以不需要保留外层函数的调用记录,因为调用位置、内部变量等信息都不会再用到了,只要直接用内层函数的调用记录,取代外层函数的调用记录就可以了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: