关于函数参数的默认值
什么时候需要为函数参数设置默认值?
答: 该参数可以省略不传的时候.(为函数参数设置默认值就意味着该参数可以省略). 所以通常情况下, 应该为函数的尾参数设置默认值. 如果非尾部的参数设置默认值, 实际上这个参数是没法省略的.
ES6 允许为函数的参数设置默认值, 即直接写在参数定义的后面.
- function log(x, y = 'World') {
- console.log(x, y);
- }
参数变量是默认声明的, 所以在函数体中不能用 let 或 const 再次声明.
使用参数默认值时, 函数不能有同名参数.
参数默认值是惰性求值的.
关于 rest 参数
定义
ES6 引入 rest 参数 (形式为... 变量名), 用于获取函数的多余参数, 这样就不需要使用 arguments 对象了. rest 参数搭配的变量是一个数组, 该变量将多余的参数放入数组中.
注意
rest 参数之后不能再有其他参数 (即只能是最后一个参数)
关于严格模式
只要函数参数使用了默认值, 解构赋值, 或者扩展运算符, 那么函数内部就不能显式设定为严格模式, 否则会报错. 解决方法有两种.
设定全局性的严格模式.
把函数包在一个无参数的立即执行函数里面.
关于箭头函数
语法描述
ES6 允许使用 "箭头"(=>) 定义函数.=> 之前的为函数参数, 用一个圆括号代表参数部分; 之后的为函数体, 用一个大括号代表函数体部分. 当然, 如果只有一个参数, 圆括号可以省略; 如果函数体只有一条语句, 可以省略大括号. 建议圆括号和大括号都不要省略, 以免造成一些不可预料的错误.
- var f = v => v;
- var sum = (num1, num2) => num1 + num2;
注意事项
不可以当作构造函数, 也就是说, 不可以使用 new 命令.
不可以使用 arguments 对象, 该对象在函数体内不存在.
不能用作 Generator 函数.
函数体内的 this 对象, 就是定义时所在的对象, 而不是使用时所在的对象.
关于函数属性
length 属性
函数的 length 属性, 将返回没有指定默认值的参数个数. 更准确的说应该返回指定默认值的参数之前的参数个数. 也就是说, 从指定了默认值的参数及该参数之后的参数都不计入 length 属性当中. 除此之外, length 属性也不包括 rest 参数.
- function log(x, y = "World") {
- console.log(x, y)
- }
- console.log(log.length) //1
- function foo(x, y = "World", z) {
- // ...
- }
- console.log(foo.length) //1
- function fun(x, ...z) {
- console.log(x, ...z)
- }
- console.log(fun.length) //1
name 属性
函数的 name 属性, 返回该函数的函数名. bind 返回的函数, name 属性值会加上 bound 前缀.
- function foo() {
- // ...
- }
- console.log(foo.name) //foo
- console.log(foo.bind({}).name) //bound foo
关于函数绑定运算符
用途
用来取代 call,apply,bind 调用.
语法
函数绑定运算符是并排的两个冒号 (::), 双冒号左边是一个对象, 右边是一个函数.
该运算符会自动将左边的对象, 作为上下文环境 (即 this 对象), 绑定到右边的函数上面.
如果双冒号左边为空, 右边是一个对象的方法, 则等于将该方法绑定在该对象上面.
- foo::bar // 等同于 bar.bind(foo)
- ::console.log // 等同于 console.log.bind(console);
来源: http://www.jianshu.com/p/6b235269531b