ES6--函数

来源:互联网 发布:windows数字签名 编辑:程序博客网 时间:2024/05/22 10:16

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

function sayHello(name){    //传统的指定默认参数的方式    var name = name||'hubwiz';    document.write('Hello '+name);}//运用ES6的默认参数function sayHello2(name='hubwiz'){    document.write(`Hello ${name}`);}sayHello();  //输出:Hello hubwizsayHello('汇智网');  //输出:Hello 汇智网sayHello2();  //输出:Hello hubwizsayHello2('汇智网');  //输出: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和people3function 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);});//ES6array.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);// 具有词法作用域的 thisvar 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,这就叫尾调用。尾调用由于是函数的最后一步操作,所以不需要保留外层函数的调用记录,因为调用位置、内部变量等信息都不会再用到了,只要直接用内层函数的调用记录,取代外层函数的调用记录就可以了
0 0
原创粉丝点击