-
默认参数
function add(num1,num2 = 0,callback = function(){}){ // es6 默认参数 num1 = (typeof num1 === 'number') ? num1 : 0; // es5默认参数 num2 = (typeof num2 === 'number') ? num2 : 0; // es5默认参数 callback(); return num1 + num2; }
-
默认参数与arguments
function add(num1,num2 = 0){ console.log(num1 === arguments[0]);//true console.log(num2 === arguments[1]);//true num1 = 2; num2 = 2; console.log(num1 === arguments[0]);// ? console.log(num2 === arguments[1]);// ? return num1 + num2; }
es5非严格模式,为true,参数重新赋值会导致arguments改变;严格模式以及es6,都为false,arguments不跟随变化。
-
不定参数 function(…values);function(…values,value)//error。
-
Function 构造函数,接收字符串创建函数,接收参数和函数体。es6的函数构造函数增加了不定参数,默认参数的函数的构造。
-
展开运算符 …values。可将数组展开。
var obj = {}; function func(v1,v2,v3){}; var arr = [1,2,3]; func.call(obj,...values); func.apply(obj,values);
-
new.taget 判断函数是否以new 进行调用。如果不为undefined,则证明函数是以构造函数的形式进行调用的。
-
箭头函数。箭头函数的arguments,this,new.target都由最近一层非箭头函数(执行环境)决定,保持一致并不可更改。
function Car(){ this.move = function(){ console.log('123123') } this.onStart = function(){ document.addEventListener('click',function(e){this.move()});//move is undefine document.addEventListener('click',(e)=>{this.move()});//ok } } var car = new Car(); car.onStart();
function(e){this.move()}由document对象进行调用,所以this指向document,但是document没有move方法,所以会报错。采用箭头函数的写法,this会绑定到onstart的this,就是car对象,代码可正常执行。箭头函数的this是不会被改变的,也就是call,bind,apply并不能改变箭头函数的this指向。
-
尾调用优化
function factorialBetter(n,result=1){ if(n<=1){ return 1*result; }else{ result = n*result; return factorialBetter(n-1,result); } } // 尾递归 function factorialBetter(n,result=1){ if(n<=1){ return 1*result; }else{ result = n*result; return factorialBetter(n-1,result); } }
尾递归满足条件:
- 尾递归不是一个闭包,没有访问外部作用域的变量。
- 尾调用是最后一条语句。
- 尾调用作为结果返回。
09-16
09-16