函数
函数的一般用法
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
}
})

浙公网安备 33010602011771号