Function
箭头函数
- ES6中对于函数的扩展最吸引人的莫过于箭头函数啦,不多说,先学会再说。
- 函数体内的this对象,是定义时所在的对象,而不是使用时所在的对象,这个特性与正常函数不同。
// 箭头定义函数
function foo() {
setTimeout(() => {
console.log('id:', this.id); // this指向{id:42}这个对象
}, 100);
}
var id = 21;
foo.call({ id: 42 }); // 42
// 普通定义函数
function foo() {
setTimeout(function(){
console.log('id:', this.id); // this指向window
}, 100);
}
var id = 21;
foo.call({ id: 42 }); // 21
- 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。没有内部this。不过都ES6了,想要定义类,直接使用class不就得了
var Demo = (foo) => console.log(foo);
new Demo('foo') // 报错啦 testFunc is not a constructor
- 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用Rest参数(...args)代替。
var demo = (foo) => console.log(arguments);
demo() // 报错 arguments is not defined
// 可以用Rest写法代替
var demo = (...args) => console.log(args);
demo('a') // ["a"]
- 不可以使用yield命令,因此箭头函数不能用作Generator函数。待研究^^!!
参数默认值
let log = (x, y = 'World') => x + ' ' + y;
log('hello', 'xiaoming'); // hello xiaoming
log('hello'); // hello World
参数解构赋值
函数的length属性
((x, y, z = 1) => 1).length // 2
- 如果设置默认值的参数不是尾参数,设置默认值的参数后面的未设置默认值的参数也不计入length
((x = 1, y, z) => 1).length // 0
作用域
var x = 1;
function foo(x, y = x){
console.log(y);
}
foo(2) // 2
let x = 1;
function foo(y = x){
let x = 2;
console.log(y);
}
foo() // 1
rest参数
(a, ...b) => 1
(a, ...b, c) => 1 // 报错