ES6浅谈 -- 函数扩展

1.length属性,函数调length可以看参数数量,但如果出现rest参数则会失真,从rest参数出现的地方失真。

2.参数是局部环境,会生成自己的一个作用域,所以会优先找实参给的值而不是全局的值。只有当没有实参或者未定义时才会去全局找,函数内部的变量也不会影响参数的作用域。

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

foo() // 3
x // 1

这里代码y的默认值是一个匿名函数,函数内部是x=2,这个地方的x是指参数x而不是指函数内的var x = 3的x,所以后面即使调用了y,改变的也是参数x的值,所以最后打印的结果是函数内的x即3而不是参数x = 2。

3.rest参数是指剩余参数,将不确定数量的参数全部作为一个数组传递进去,它和arguments类数组对象不同,例如如果需要对所有参数排序,那么需要用call方法将arguments继承数组的方法,但rest参数可以直接调用数组的方法。rest参数后面不能跟参数。

4.箭头函数:大括号会被认为是代码块,所以如果要返回一个对象需要在外面打圆括号。()=>({a:1})这样。箭头函数内参数可以解构,可以简化回调函数。但使用需要注意this指向,this永远指向定义时所在对象,而不是调用时对象。还有一个很好的例子

function foo() {
  return () => {
    return () => {
      return () => {
        console.log('id:', this.id);
      };
    };
  };
}

var f = foo.call({id: 1});

var t1 = f.call({id: 2})()(); // id: 1
var t2 = f().call({id: 3})(); // id: 1
var t3 = f()().call({id: 4}); // id: 1

这个例子充分说明了箭头函数是没有自己的this的,所有的this都指向了foo,所以t1,t2,t3的结果都是1。

猜你喜欢

转载自www.cnblogs.com/harrywu96/p/12157131.html