5.作用域

使用默认参数时,参数会形成一个独立的作用域,此作用域与函数体中的作用域是平行关系,互不影响。

var x = 1;
function show(x, y= function () { x=2; }) {
var x = 3;
y();
console.log(x);
}
show(); //3
console.log(x); //1

上面代码中,函数show的参数形成了一个单独的作用域。这个作用域里面,首先声明了变量 x ,接着声明了变量 y ,y 的默认值是一个匿名函数。这个匿名函数内部没有定义变量 x ,所以找到上一层作用域的变量 x ,即第一个参数 x,赋值为2。函数show 内部又声明了一个内部变量 x ,这个 x 与第一个参数 x 不是同一个作用域,所以不是同一个变量。上面代码标的颜色中,相同颜色表示处于同一作用域。

如果将 var x = 3 的 var 去除,函数show 的内部变量  x 就指向第一个参数,与匿名函数内部的 x 是一致的。如下面代码。

var x = 1;
function show(x, y= function () { x=2; }) {
x = 3;
y();
console.log(x);
}
show(); //2
console.log(x); //1

6. rest参数

ES6 引入rest参数(形式为 ... 变量名),用于获取函数多余参数。这样就不需要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。

function add (...values){
let sum = 0;
for(var val of values){
sum += val;
}
return sum;
}
add(2,5,3); //10

arguments 对象不是数组,而是一个类似数组的对象。而 rest 参数是一个真正的数组,数组特有的方法都可以使用。注意,rest 参数只能是最后一个参数,否则会报错。

7.name属性

函数的 name 属性,返回该函数的函数名。

8.箭头函数

ES6 允许使用“箭头”(=>)定义函数。

window.onload = ()=>{
console.log('a');
}; //等同于
window.onload = function (){
console.log('a');
}

只有一个参数时可以省略参数的括号。函数只有一条 return 语句时,可以不写return,不加函数体的大括号{}。如:

let show = x => { console.log(x); };    //只有一个参数时,可省略参数的括号
show(1); //1 let sum = (a, b)=> a + b; //只有一条return语句时,可省略return和{}
console.log(sum(1, 2)); //3

由于大括号被解释为代码块,所以如果箭头函数直接返回一个对象时,必须在对象外面加上括号,否则报错。如:

let show = () =>({ x:1,y:2});

箭头函数的一个用处是简化回调函数

console.log([1,2,3].map(x => x * x));   //[ 1, 4, 9 ]

let res = [8,3,1,5].sort((a,b) => a-b);
console.log(res); //[ 1, 3, 5, 8 ]

箭头函数的几个注意点:

  1. 函数体内的 this 对象,就是定义时所在的对象,而不是使用时所在的对象。(箭头函数的 this 指向问题,下篇再详解)
  2. 不可以当做构造函数,也就是说,不可以使用 new 命令,否则会抛出一个错误。
  3. 不可以使用 arguments 对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
  4. 不可以使用 yield 命令,因此箭头函数不能用作 Generator 函数

ES6学习笔记之函数(二)的更多相关文章

  1. es6学习笔记-async函数

    1 前情摘要 前段时间时间进行项目开发,需求安排不是很合理,导致一直高强度的加班工作,这一个月不是常说的996,简直是936,还好熬过来了.在此期间不是刚学会了es6的promise,在项目有用到pr ...

  2. ES6学习笔记(函数)

    1.函数参数的默认值 ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面. function log(x, y = 'World') { console.log(x, y); } log(' ...

  3. ES6学习笔记(十二)异步解决方案Promise

    1.Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了P ...

  4. ES6学习笔记之函数(一)

    1.函数的默认参数 在ES6 之前,我们不能直接为函数的参数指定默认值,只能采用其他方法.如: function show (num, callback){ num = num || 6; callb ...

  5. es6学习笔记6--Generator 函数

    基本概念 Generator函数有多种理解角度.从语法上,首先可以把它理解成,Generator函数是一个状态机,封装了多个内部状态. 执行Generator函数会返回一个遍历器对象,也就是说,Gen ...

  6. ES6 学习笔记之三 函数参数默认值

    定义函数时为参数指定默认值的能力,是现代动态编程语言的标配.在ES6出现之前,JavaScript是没有这种能力的,框架为了实现参数默认值,用了很多技巧. ES6 的默认参数值功能,与其他语言的语法类 ...

  7. ES6学习笔记(6)----函数的扩展

    参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ 函数的扩展 函数的默认值 : ES6可以为函数指定默认值 (1)指定默认值的两种方式 a.函数参 ...

  8. es6学习笔记--箭头函数

    基本用法 ES6允许使用“箭头”(=>)定义函数. var f = v => v; 上面的箭头函数等同于: var f = function(v) { return v; }; 如果箭头函 ...

  9. ES6 学习笔记(十二)代理器Proxy的简单使用

    1.前言 以前在学习react时做了个仿手机端的QQ音乐项目.当时的数据是通过proxy代理的QQ音乐数据接口,直接写在package.json里面.Proxy 对象(Proxy)是 ES6的特性,只 ...

随机推荐

  1. 3D教育类小图标_三维立体学习类icon图标素材

    3D教育类小图标_三维立体学习类icon图标素材

  2. 10.Debug

    1.Debug模式 1.1 什么是Debug模式 是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序. 1.2 Debug介绍与操作流程 Debug调式, ...

  3. 通过Dapr实现一个简单的基于.net的微服务电商系统(十二)——istio+dapr构建多运行时服务网格

    多运行时是一个非常新的概念.在 2020 年,Bilgin Ibryam 提出了 Multi-Runtime(多运行时)的理念,对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华.那到 ...

  4. SpringBoot整合shiro系列-SpingBoot是如何将shiroFilter注册到servlet容器中的

    一.先从配置类入手,主要是@Bean了一个ShiroFilterFactoryBean: @Data @Configuration @Slf4j @EnableConfigurationPropert ...

  5. 《SystemVerilog验证-测试平台编写指南》学习 - 第1章 验证导论

    <SystemVerilog验证-测试平台编写指南>学习 - 第1章 验证导论 测试平台(testbench)的功能 方法学基础 1. 受约束的随机激励 2. 功能覆盖率 3. 分层的测试 ...

  6. Linux_防火墙与SElinux

    一.防火墙与SElinux 1.防火墙和selinux 防火墙 iptables          默认允许所以 firewalld         默认拒绝所有 ebtables 不认识,不管 se ...

  7. NB-IOT技术与发展问答

    http://blog.csdn.net/pan0755/article/details/70145936 该部分分享的是物联网各垂直应用领域里,NB-IoT技术的部署,看看适合NB-IoT技术的垂直 ...

  8. DDD兴起的原因以及与微服务的关系

    DDD为什么能火起来? 我们先不讨论DDD的定义, 先梳理一下DDD火起来的背景, 根据我学习的套路, 永远是为什么为先,再是解决什么问题,是什么东西, 最后如何使用.我们都知道这些年随着设备以及技术 ...

  9. kafka实战教程(python操作kafka),kafka配置文件详解

    kafka实战教程(python操作kafka),kafka配置文件详解 应用往Kafka写数据的原因有很多:用户行为分析.日志存储.异步通信等.多样化的使用场景带来了多样化的需求:消息是否能丢失?是 ...

  10. guava cache 缓存

    1.guava缓存 新建一个缓存对象cache,当取不到key对应的值时,生成一个,并插入到cache中 LoadingCache<String,String> cache = Cache ...