Loading

函数

函数的一般用法

function foo(x){}      // 不带参数
function foo(x,y=1){}  // 默认参数
() => {}           // 箭头函数

结构赋值默认值结合使用

function foo({x,y=1}){}
function foo( {x=1,y=0}={}){}  //若不传入参数则默认传入一个空对象,且x=1,y=0
function foo( {x,y}={x:0,y:0}) //若不传入参数则默认传入一个具有具体属性(x,y)的对象

参数的默认值一般在尾部,若不在尾部实际上这个参数无法省略,若要测试放在中间的默认值可以使用_undefined_

function f(x,y=1,z)
f(1,undefined,2) //1,1,2

函数 length属性时指需要传入参数的个数,默认值参数和rest参数(...args)都不计算,函数的name属性是返回函数名

作用域

一旦设置了参数默认值,则函数在声明初始化时,参数会形成单独的作用域,初始化结束,这个作用域消失

//参数单独形成一个作用域,在这个作用域中先声明了第一个变量x,再声明了第二个变量y,变量y中的x指向第一个变量x,函数运行时,在函数的作用域中声明了一个变量x(x=3),最后打印出的x找到作用域链中最近的x(x=3)
var x =1
function(x,y=function(){x=2}){
    var x = 3
    y()
    console.log(x) //3
}

//去除声明后,最近的x为参数中第一个x
var x =1
function(x,y=function(){x=2}){
    x = 3
    y()
    console.log(x) //2
}

箭头函数

函数体内的this就是定义时所在对象,而不是使用时所在对象(在定义时就将当前对象this绑定给箭头函数的this,即箭头函数没有自己的this,即不能使用apply,call,bind改变this指向)

不能使用_new_

不能使用_arguments_

不能使用_yield_

绑定_this_ 可以使用 ::

foo::bar  //左边是对象,右边是函数

尾递归

只保持一次调用记录,外层函数不需要使用获知内层函数的返回值

function toc(f) {
  var value;
  var active=false;
  var accumulated = [];

  return function accumulator(){
    accumulated.push(arguments);//arguments:{"0":value1,"1":value2}
    if ( !value) {
      active = true;
      while(accumulated.length){
        value=f.apply(this,accumulated.shift());  //shift表示删除数据中第一元素并返回
      }
      active = false;
      return value; //除最后一次调用外都返回undefined,因此程序将不再记录之前返回的值
    }
  }
}

var sum = toc(function(x,y){
  if (y>0){
    return sum(x+1,y-1)
  }else {
    return x
  }
})
posted @ 2021-11-15 23:19  淡蓝色的点  阅读(70)  评论(0)    收藏  举报