猫幻  

es6之前函数是不能参数设置默认值的 

参数1是必须传递 其余参数有默认值,可传递

函数参数的返回值,也可以是另外一个函数的返回值;

    function fn(r,p){
    return 3.14;
    }
    function fn(r, p = pi()){//pi()返回值交给p
     console.log(r*r*p);
        }
fn(10);
只想传递第二往后的参数参数一保持默认值可以用undefined占位;
function fn(name='Mr.lee',age){
    console.log(name);//null 空都不行只能undefined
    console.log(age);
}
fn(undefined,100);
 
支持参数二使用参数一的值作为默认值不支持参数一使用参数二的值作为默认值
function fn(x,y=x) {
    console.log(y);
   
}
fn(5);
函数的参数可以有不定参数...other
es6提供了一个name属性用于获取函数名有四种
第一种:
function fn(){}
第二种:
let fn=function(){}
第三种:
let obj={fn3:function(){},}
第四种
console.log(new Function().name);第四种匿名函数anonymon
 
 
箭头函数
es6新增一个使用=>箭头符号定义函数的语法特性
let fn=name=>name;
//let fn=(function(name)箭头前面的name){(return name;箭头后面的name也就是参数的返回值)};
console.log(fn('Mr.lee'));
如果函数体需要更复杂的操作可以用将箭头符号右边使用传统的函数体
let fn=(x,y)=>{
    return x+y;
}
console.log(fn(10,20));
箭头函数可以传递俩个或以上的参数运算后返回
 let fn=(x,y)=>x+y;
 //比之简便let fn=(function(x,y)=(x,y)){((return x+y;)=(x+y))}
 console.log(fn(10,20));
如果定义的函数并不需要传递参数可以用()方式直接返回
 let fn=()=>'Mr.lee';
 console.log(fn());


如果箭头符号右边是对象则需要用()包含着
let fn=name=>({name:name,age:100});
console.log(fn('Mr.lee').name);
es6支持箭头符号左边是对象作为参数右边是对象的属性运算
let fn=({name,age})=>name+','+age;
console.log(fn({name:'Mr.lee',age:100}));
自我执行函数也可以使用箭头符号
((name)=>{
    console.log(name);
})('Mr.lee');
this
es6之前this的指向是个头疼的问题
let obj={
    name:'Mr.lrr',
    age:100,
    fn:function(){
        // let that=this;
        // setTimeout(function(){
        //     console.log(that.name+','+that.age);
        // },500)
        setTimeout(()=>{
        console.log(this);
        console.log(this.name+','+this.age)
        箭头函数
        },500)
    }
};
abj.fn();
2.上面的例子比较典型,this 全局指向window,在某个对象内部指向当前对象;
3.当obj对象下包含了类似setTimeout函数内部,这时this指向就出现问题了;
4. web环境下,它指向了window,而node环境下它指向setTimeout:
5.所以,我们通俗的做法,就是将this在setTimeout外部进行赋值保存;
6.箭头函数的出现,彻底解决了this在内部指向的问题,直接指向我们所需要;
7.因为,箭头函数中的this是最外层定义的函数绑定,不受内部影响;
 
 
 
箭头支持一些内置函数的使用
let arr =[3,1,2].sort(function(a,b){
    return b-a;
})
let arr =[3,1,2].sort((a,b)=>a-b);
console.log(arr);
箭头函数不支持arguments绑定请直接使用...other模式rest运算符
// 不确定参数时使用...
let fn=(...other)=>{
    return other[0]+other[1]
}
console.log(fn(10,20));
 
箭头函数和普通函数一样都可以被typeof和instanceof
console.log(typeof fn);//得到的function
console.log(fn instanceof Function);//得到true 是函数
 
尾调用
1.什么是尾调用呢在一个函数的最后可执行的一步调用了其它函数
//递归函数
'use strict';//严格模式:有些不规范的在非严格模式下不会报错严格模式下会报错
function fn(x){
    if(x<=1){
        return 1;
    }
    return fn(x-1);
}
fn(10);
2.那?什么又是尾调用优化?为何要优化?因为:每次尾调用都会创建栈帧;
3.如果尾调次数过多,而内存中的调用栈越来越大,可能就会出现程序问题;
4.尤其是在递归函数的问题上,尾调用优化适合在这种场景中使用;
5.首先要说明,尾调用优化必须是在ES6的严格模式下,'use strict ';
6.严格模式,可以设置为全局作用域,也可以在函数体内有效;
7.严格模式对变量、对象和函数做了一些代码规范等等,具体规范可以搜索;8.而对于尾调用,必须严格按照三个规则,才能执行严格模式下的优化,如下:
(1).尾调用必须return返回:
 / go(×);错误
(2).尾调用return返回不得含其它操作l / return go(x) + 1;错误
(3).尾调用return返回的不是函数,而是函数赋值的变量,不在尾部;

 
posted on   猫幻  阅读(103)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
 
点击右上角即可分享
微信分享提示