当前位置: 首页 > Web前端 > CSS

ES6函数扩展

时间:2023-03-30 18:23:41 CSS

函数扩展我们可以从三个方面来理解理解:参数的默认值箭头函数优化尾调用的参数默认值在ES6之前,我们不能直接给函数参数指定默认值,只能可以使用替代方法。在ES6中,我们允许我们直接为函数的参数设置默认值,通过等号=直接在括号内给参数赋值。示例:函数日志(姓名,年龄=18){console.log(姓名,年龄);}console.log('xkd');//输出:xkdconsole.log('summer',20);//输出:summer20console.log('mark','');//Output:mark如果函数有某个参数,说明这个参数变量已经默认声明了,我们不能再用let或者const来声明这个变量。functionxkd(a=1){leta=2;}//Error:SyntaxError:Identifier'a'hasalreadybeendeclared还需要注意的是,在使用函数默认参数时,不允许参数重名:functionweek(a,a,b=100){/*...*/}//错误信息:SyntaxError:Duplicateparameternamenotallowedinthiscontext参数的默认值是惰性求值:leta=100;函数xkd(sum=a+1){console.log(sum);}xkd();//Output:101restvariableparameterES6引入了restparameter,可变参数用于表示不确定参数的个数,由...标识加上命名参数字符。例子:functionadd(...values){letsum=0;for(varvalofvalues){sum+=val;}返回总和;}console.log(add(10,5,7));//Output:22上面代码的add函数是一个求和函数,通过rest参数可以给函数传递任意数量的参数。注意rest参数只能放在参数组的末尾,不确定参数只有一个。该参数后不能有其他参数,否则会报错。functionfunc(a,...b,c){//...}//Error:SyntaxError:Restparametermustbelastformalparameter如果我们想使用函数的length属性来获取参数个数,它不包括休息参数。functionfunc1(a,b){//...}functionfunc2(a,b,...c){//...}console.log(func1.length);//输出:2console.log(func2.length);//输出:2name属性函数的name属性,可用于返回函数的函数名。示例:函数xkd(){console.log(xkd.name);//输出:xkd}xkd();也可以写成:varxkd=function(){}console.log(xkd.name);//output:xkdarrowfunctionES6允许使用arrows=>来定义函数,这样定义的函数称为箭头函数。箭头函数的两个要点,一个是它的this指向了它当时定义的区域,一个是它没有作用域提升。例子:varx=function(y){returny;}上面的函数是用箭头函数写的,可以写成:varx=y=>y;如果箭头函数不需要参数或者需要多个参数,用括号表示参数部分。例子:比如下面求两个数之和的函数:varsum=function(num1,num2){returnnum1+num2;}等价于箭头函数如下所示:varsum=(num1,num2)=>num1+num2;如果箭头函数的代码块部分不止一条语句,用花括号括起来,用return语句返回。示例:varsum=(num1,num2)=>{returnnum1+num2;}由于花括号被解释为代码块,如果箭头函数直接返回一个对象,必须在对象外加上括号,否则会报错。示例:letobj=age=>({name:"xkd",age:age});箭头函数可以与变量解构结合使用。示例:constfull=({first,last})=>first+''+last;//相当于functionfull(person){returnperson.first+''+person.last;}当使用箭头函数时,你需要注意以下问题:函数体中的this对象指向定义所在的对象,而不是使用所在的对象。它不能用作构造函数,也就是说不能使用new命令。不能使用arguments对象,可以使用rest参数代替。不能使用yield命令,因此箭头函数不能用作Generator函数。尾调用优化尾调用是指一个函数的最后一步是调用另一个函数。当它不适用于外部变量时,只保留内部函数的调用框架。例子:比如下面的func()函数最后一步是调用函数show(),称为尾调用:functionfunc(x){returnshow(x);}如果调用一个函数后,还有其他操作,不是尾调用。注意尾调用不一定出现在函数的最后,只要是最后一步即可,比如下面的代码:functionfunc(x){if(x>0){returnf1(x)}returnf2(x);}函数f1和f2都属于尾调用,因为这两个函数调用是函数func的最后操作。在ES5中,尾调用的实现是新建一个栈帧栈帧,压入调用栈,代表一次函数调用。因此,每个未使用的堆栈帧都将存储在内存中。当调用栈变得过大时,就会导致程序出现问题,也就是我们常说的栈溢出。在ES6严格模式下,如果满足以下三个条件,则尾调用不再创建新的栈帧,而是复用当前栈帧:函数不是闭包。在函数内部,尾调用是最后一条语句。尾调用的结果作为函数值返回。示例:“使用严格”;functionfunc(){//optimizedreturnf();}以下情况不会被优化:当不是作为函数值返回时,不会被优化:functionfunc(){f();}返回值后还需要做其他操作,不做优化:functionfunc(){return1+f();//返回值后还需要做其他操作};函数调用没有结束,不会优化:functionfunc(){constresult=f();返回结果;};调用的函数是闭包函数,不会优化:functionfunc(){consta=1;constf=()=>a//这是一个闭包函数,函数f需要访问局部变量areturnf();};更多链接:https://www.9xkd.com/