ES6--函数

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

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,这就叫尾调用。

尾调用由于是函数的最后一步操作,所以不需要保留外层函数的调用记录,因为调用位置、内部变量等信息都不会再用到了,只要直接用内层函数的调用记录,取代外层函数的调用记录就可以了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值