5.函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15706743/article/details/82660971

1.函数参数

1.设置参数默认值 在参数少传的情况下 可以保证有值

    function fn(x="hello",y="haha") {
        console.log(x + y);
    }
    fn(1);//"1haha"

2.参数使用解构赋值

    function fn1({name="haha",age=19}) {
        // console.log(name);//如果没有传参{name="haha",age=19}=undefined  undefined不是对象 所以这一句会报错
     // fn1();

不传入参数

function fn2({name="hello",age=19}={}) {
    console.log(name, age);
    //如果没传参 {name="hello",age=19}={} 这一句不会报错  会使用默认值
}
fn2();//"hello" 19
fn3();//"hello" 19
function fn3({name,age}={name:"hello",age:19}) {
    //{name,age}={}
    console.log(name, age);
}
fn3({});//undefined undefined
  • 当不传入任何参数的时候 fn2和fn3执行的结果是一模一样的使用默认值
  • 但是在当传入空对象的时候fn2({})和fn3({})的结果却是不一样的
  • fn2中的name=”hello”,age=19}={} 传入空对象即为默认值

3.length属性

指的是形参的个数,

如果形参有默认值情况length就会失真,变成没有默认值形参的个数

    function fn4(x,y) {

    }
    console.log(fn4.length);//2

    function fn5(x,y=1) {

    }

    console.log(fn5.length);//1
  • 关于参数默认值的位置:一般参数的默认值放在最后面

  • 如果我想让第一个参数走默认值 第二个参数走传递进的实参 这么写显然是不行的 会报错

    function fn6(x=10,y=20) {

    }
    // fn6(,1);//报错

正确方法:

function fn6(x=10,y=20) {
    console.log(x,y);
}
fn6(1)
//1 20

4. … 将函数剩下的参数 变成数组,只能放到参数最后面

function sum(currency,...args){
    return currency+eval(args.join('+'));
}
console.log(sum('¥',1,2,3,4,5,6));

5.arguments

一个类数组

ES6中类似的使用方法

function fn7(...arg) {//展开参数
    console.log(arguments);
    console.log(arg);//根据解构赋值 除了arguments 我们也可以这样拿 实参
}
fn7(1,2,3,4,5);
//{ '0': 1, '1': 2, '2': 3, '3': 4, '4': 5 }
//[ 1, 2, 3, 4, 5 ]

6.参数作用域问题

函数执行的时候先给形参赋值 形参也是私有变量 如果给形参的默认值是一个变量 先看是不是自己的私有变量 不是自己的再找全局中是否有这个变量 没有就报错

    let m=10,n=100;
    function fn8(x=m,y=n) {
        //私有作用域:私有变量 x,y,m,n
        //进入函数时先给形参赋值,给x赋值的时候还没有走到函数里面 所以会找到全局的
        console.log(x);
        console.log(y);
        let m = "haha";//改用var 结果与let一样
        let n = "ES6";
    }
    fn8();//10 100
    fn8(1);//1 100 说明默认值用的是全局的

若是注销函数外 m和n的声明 会报错 说明没有使用函数私有作用域中的m和n

    let x=100;
    function fn9(x,y=x) {
        //先进来给形参赋值找到了全局x=1,然后y=x=1
        console.log(y);//1
    }
    fn9(1);

2.函数name

1.匿名函数name

    console.log((function () {
    }).name);//""

2.特殊情况

1.通过bind方法得到一个新的函数 name是 “bound 原来函数的名字”

let fn1 = fn.bind(null);
console.log(fn1.name);//"bound fn"

2.通过构造函数方式创建一个函数 它的名字是”anonymous”

  • new Function(“形参”,”函数体”)
  • new Function(“函数体”)
  • function fn(形参) {函数体}
let fn2 = new Function("x,y","console.log(x,y);return x+y;");
console.log(fn2(10, 100));//先执行 打印了10 100 然后打印了110
console.log(fn2.name);//anonymous

例题:如何将下面的JSON字符串变为JSON对象 不使用JSON方法 也不使用 eval方法

let str = '[{"name":"hello"},{"age":19}]';

let arr = (new Function("return"+str))();
//只写一个参数就是函数体  字符串可以拼接 "return [{"name":"hello"},{"age":19}]"
console.log(arr);// [{…}, {…}]
//[ { name: 'hello' }, { age: 19 } ]

3. 箭头函数

function a(){
    return {}
}
let a = ()=>({})
console.log(a());

function fn(a){
    return function(b){
        return a+b
    }
}
let fn = a=>b=>a+b;
fn(1)(2);

1.传统写法

function fn(x,y) {}

2.箭头函数,它是匿名函数

let fn = (x,y)=>{};

3.简写规则

  1. 假如函数体只有一行代码 : return xxx
  2. 可以省略{ }和return
  3. 形参只有一个可以省略小括号
let fn = x=>x+1;//相当于function (x){return x+1;}

4.使用场景

通常函数当做参数的时候(回调函数)使用箭头函数

let ary = [1,2,3,"haha"];
let a = ary.filter(item=>typeof item === "string");
console.log(a);//["haha"]

5.箭头函数没有this指向,它里面的this是上一级的作用域

let obj = {
    fn:function () {
        let f = ()=>{
            console.log(this);
        };
        f();
    }
};
obj.fn();//{fn: ƒ}

6.箭头函数没有arguments

let f1 = (...arg)=>{
    // console.log(arguments);
    console.log(arg);
};
// f1(1,23);//报错:arguments is not defined
f1(1,2,3);//[1, 2, 3]

7.箭头函数不可以用作构造函数 因为不可以使用new执行

8.对象不是作用域 ,作用域之只有函数 和{} 全局

let name = 1;
let obj = {
    name:2,
    fn:()=>{ // this
        console.log(this)
        console.log(this.name)
    }
}
obj.fn();

4. 展开运算符 拓展运算符

… 的作用 再我们的函数形参中 是剩余运算符,把剩下的结果转化成数组

再对象中或数组中 也可以用…

数组的拼接:

  1. 将非数组变成数组
  2. 将数组变成非数组
  3. 将类数组变为数组(具有length属性)

1.展开argument

    let str = "123";
    console.log([...str]);//["1", "2", "3"]
    console.log([...list.getElementsByTagName("li")]);//[li, li, li]

    function fn() {
        console.log([...arguments]);
    }
    fn(1,2,3,4);//[1, 2, 3, 4]

2.合并数组

    let arr1 = [1,2,3,4];
    let arr2 = [5,6,7,8];
    console.log(arr1.concat(arr2));//[1, 2, 3, 4, 5, 6, 7, 8]
    console.log([...arr1, ...arr2]);//[1, 2, 3, 4, 5, 6, 7, 8]

3.求最大值

求数组最大值,Math.max方法是不能直接传数组的,那我们就可以利用…方法来把它变成非数组

之前是想办法将它变为一个一个值,比如利用apply的方法将数组的值一个个传入

let arr = [1,2,3,4,5]
console.log(Math.min.apply(Math,arr));
console.log(Math.min(...arr));
//把arr的每一项作为函数参数一项项传入

function a(a,b){
    return a+b;
}
let fn = (n,b,c,...args)=>{
    console.log(a(...args))
}
fn(1,2,3,4,5);

…args

function a(a,b){
    return a+b;
}
let fn = (n,b,c,...args)=>{
    console.log(a(...args))
}
fn(1,2,3,4,5);

猜你喜欢

转载自blog.csdn.net/qq_15706743/article/details/82660971