一、设置默认参数

ES6之前,给函数设置默认参数是这样做的:

function fn(a) {
if(typeof y === undefined){
a = a || 'hello';
}
console.log(a);
}
fn('hi'); // 'hi'
fn(false); // false

这里之所以要判断一下,是因为我们本意是函数没有传值时才给参数 a 设置为 'hello',但是如果调用函数时传入了布尔值 false,也会把参数 a 设置为 'hello'。

在 ES6 中允许为函数的参数设置默认值,直接写在参数的后面即可:

function fn(a = 'hello') {
console.log(a);
}
fn('hi'); // 'hi'
fn(false); // false

非常的简洁,严谨,不用判断,不过有一点需要注意,参数变量是默认声明的,所以,在函数体内,不能再使用 let 或者 const 再次声明:

function fn(a = 'hello') {
let a = 'hi'; // error
const a = 'ha'; // error
}

二、rest参数

ES6之前,获取函数多余的参数用的是 arguments:

function fn(a) {
for(var i = 0; i < arguments.length; i ++){
console.log(arguments[i]);
}
console.log(a);
}
fn(1, 2, 3);
//
//
//
//

而且这里 arguments 对象包括的是所有的参数,并不是严格意义上的多余的参数。

ES6 中,现在就可以使用 rest参数,用来完成获取多余的参数这件事了,很方便,语法为 ...变量名:

function fn(a, ...value) {
value.forEach(function (item) {
console.log(item);
});
}
fn(1, 2, 3);
//
//

函数体内,value 变量就是一个数组,包含传入的2个多余的参数 2、3。

这里有一点需要注意,rest参数 只能放在最后面,不然就报错:

function fn(a, ...value, b) {   // error

}

 三、箭头函数

ES6允许使用箭头( => )来定义函数,这里定义一个最简单的函数:

var sayHi = () => {
alert('hi');
} // 等价于 function sayHi() {
alert('hi');
}

需要传参的话把参数写在圆括号里即可:

var add = (a, b) => {
console.log(a + b);
} //等同于 function add(a, b){
console.log(a + b);
}
add(10, 20); //

如果参数只有一个,也可以不使用圆括号:

var fn = a => {
console.log(a);
}
fn(100); //

而且如果只有一条语句,甚至花括号也可以省略。

var fn = a => console.log(a);
fn(100); //

这里还有一种极其简单的替代写法:

var fn = a => a;

// 等同于

var fn = function(a){
return a;
}
console.log(fn(10)); //

但是这种写法需要谨慎使用,比如返回的是一个对象就需要外面包一个圆括号,不然报错:

var fn = () => {username: 'tom', age: 24};   // error

// 需要这样才可以

var fn = () => ({username: 'tom', age: 24});

箭头函数有以下几个注意点:

  • 箭头函数中的 this,指的是定义时所在的对象,而不是调用时所在的对象。
  • 不可以当做构造函数,也就是说,不可以使用 new 操作符,否则报错。
  • 不可以使用 arguments对象。

上面第一点,需要格外注意,因为它确定了箭头函数中的 this 的指向是不可变的:

var id = 10;
function fn() {
setTimeout(function () {
console.log(this.id);
},100)
}
fn.call({id: 20}); //

上面代码中,setTimeout 中的函数定义时在 fn函数 生成时,此时 this 是指向 {id: 20} 的,但它的真正执行却要等到100毫秒以后,这时 this 就指向了 window 了。如果我们非要改变这种情况,一般是这样做:

var id = 10;
function fn() {
var that = this;
setTimeout(function () {
console.log(that.id);
},100)
}
fn.call({id: 20}); //

现在在箭头函数中,直接写即可:

var id = 10;
function fn() {
setTimeout(() => {
console.log(this.id);
},100)
}
fn.call({id: 20}); //

由此可见,箭头函数是可以让 setTimeout 里面的 this,指向定义时所在的作用域,而不是调用时的作用域。

ES6中函数的扩展的更多相关文章

  1. es6(三):es6中函数的扩展(参数默认值、rest参数、箭头函数)

    1.函数可以设置参数默认值 function test1(x,y=1){ console.log(x,y) } test1(10)//10 1 2.rest参数:形式为...变量名 function ...

  2. ES6中函数新增的方式方法

    ---恢复内容开始---   绪 言 ES6 大家对JavaScript中的函数都不陌生.今天我就为大家带来ES6中关于函数的一些扩展方式和方法. 1.1函数形参的默认值 1.1.1基本用法 ES6 ...

  3. ES6中对象的扩展

    ES6不仅为字符串.数值和数组带来了扩展,也为对象带来了很多新特性.这一节,我们来一起学习一下对象的扩展. 对象的传统表示法 我们回顾一下,对象的传统表示法: let person = { " ...

  4. ES6 之 函数的扩展 尾调用以及尾递归

    函数参数的默认值 function log(x, y) { y = y || 'world' console.log(x + ' ' + y); } log('hello') // hello wor ...

  5. ES6中字符串的扩展

    一.查找字符串 在ES5中,可以使用 indexOf 方法和 lastIndexOf 方法查找字符串: let str = 'hello world'; alert(str.indexOf('o')) ...

  6. ES6入门——函数的扩展

    1.函数参数的默认值 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法.现在ES6可以为函数的参数添加默认值,简洁了许多. ES5 function show(a,b){ b = b ...

  7. 【ES6】函数的扩展

    1.函数参数默认值[详情例子参照ESMAScript 6入门 (阮一峰)] 允许为函数的参数设置默认值,即直接写在参数定义的后面.[例子1] 参数变量是默认声明的,所以不能用let或const再次声明 ...

  8. ES6中函数参数默认值问题

    参数默认值 // 以前的参数默认值写法 let fn = (a, b) => { a = typeof a === "undefined" ? 10 : a b = type ...

  9. 关于es6中对象的扩展

    1.Object.is() es5比较两个值是否相等,只有两个运算符,相等(==) 和 严格相等(===),他们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0 等于 -0.es6提 ...

随机推荐

  1. 六:YARN Node Labels

    参考:http://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-label-based-scheduling/ 为不同的DATANODE打标签,通过标签 ...

  2. CentOS Openvpn搭建以及 linux&&windows客户端的连接

    本文参考:http://www.centoscn.com/CentosServer/test/2014/1120/4153.html 一. Server安装准备     (CentOS release ...

  3. 【转】c++面试基础

    1,关于动态申请内存 答:内存分配方式三种: (1)从静态存储区域分配:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在. 全局变量,static变量. (2)在栈上创建:在执行函 ...

  4. c# 调取 c++ dll____c#调用dll

    1.以海康摄像头dll为例.(文章转载https://www.cnblogs.com/smartsensor/p/4343744.html) 海康SDK编程指南 目前使用的海康SDK包括IPC_SDK ...

  5. 解决python中文编码错误问题

    对于初学者而言,编码问题或许还没有没重视起来,但是编码问题是中文开发者必须面对的.今天来看下python开发中如何解决编码问题.注意:本篇讲的是最常见的一种编码问题,其他编码问题,如json函数引起的 ...

  6. Unity3d学习日记(四)

      跟着Unity的教程做了两天,做成了一个叫作survivalShooter的游戏,感觉还挺有意思的,做好后我就把它挂到了个人网站上.   如果你在我的网站的主页的话,点击这个图片就能跳到游戏界面. ...

  7. 普通用户如何启动WCF服务

    做Winform项目时,部署到客户机上有两个应用程序,Host和Client,在Host上运行着WCF服务供Client调用.平时现在在测试的时候都没发现有问题,但是当安装到客户的正式环境时发现服务启 ...

  8. 关于对 NUMA 理解(学习笔记,便于以后查阅)

    对NUMA的理解: NUMA是多核心CPU架构中的一种,其全称为Non-Uniform Memory Access,简单来说就是在多核心CPU中,机器的物理内存是分配给各个核的,架构简图如下所示: 每 ...

  9. BZOJ 1082 栅栏(二分+DFS剪枝)

    首先,长度短的木板一定比长度长的木板容易得到,因此若要得到最多的木板,它们必定是所有木板中最短的——可以对木板排序后二分答案(用k表示). 判断是否合法就用搜索,但数据有点大,要用到两个剪枝.一个是若 ...

  10. Python 嵌套函数和闭包

    Python 嵌套函数和闭包 1.函数嵌套 如果在一个函数内部定义了另一个函数,我们称外部的函数为外函数,内部的函数为内函数,如下代码: def out_func(): def inner_func1 ...