函数进阶

设置函数默认值

        /*
        function fun(n,m){
            return n+m;
        }
        let result=fun();//没有参数时n和m的值都是defined
        console.log(result);//NaN Not a Number
        */
        function fun(n=10,m=20){//设置默认值
            return n+m;
        }
        let result=fun();//没有参数时就以默认值计算
        console.log(result);//30

立即执行函数


声明后立即被调用,且无法再次被调用,用完一次就没了。

作用域链



类似于全局变量和局部变量,就近原则,从内往外找

闭包

函数里的函数就是闭包,如fun2

封装体现在外部可以调用闭包函数fun2,但是无法调用其中的变量n、m
f的结果是fun2,所以f();的结果是调用fun2函数
闭包的特性体现在f=fun1();表明外部函数已经执行完了
但因为后面还有内部函数result=f();没执行,所以还没有销毁里面的变量

代码封装


外部通过module调用add,但是无法获取变量ab,从而实现封装。这是老代码的写法,看懂就行

箭头函数

  • 简化写法
/*
        const fun = function(x){
            return x*x;
        }*/
        //箭头函数
        const fun = x => x*x;//如果变量有两个以上就要加括号,const fun = (x,y) => x*y;
  • this
const cat={
            name:"mao",
            sayName(){
                setInterval(function(){//每个一秒输出cat的name
                    console.log(this.name);//但是发现什么也没输出
                },1000);
            }
        };
        cat.sayName();

什么也没输出的原因是setInterval是window对象的方法,console.log(this.name)的this指的是window,而window没有name属性

要想让this指的是cat,可以定义一个变量

const cat={
            name:"mao",
            sayName(){
                let self=this;//指向cat
                setInterval(function(){
                    console.log(self.name);//self指向cat,也可以不用self,而知cat.name
                },1000);
            }
        };
        cat.sayName();

但这样很麻烦,加了个变量,这时可以用箭头函数的特性

const cat={
            name:"mao",
            sayName(){
                setInterval(() => {//sayName没有参数就用()表示
                    /*
                    普通函数指向的是调用该函数的对象,这里是setInterval调用的console
                    所以this指向setInterval的对象window

                    箭头函数:在哪定义(它只会在自己作用域的上一层继承this),this就指向谁。
                    它作用域的上一层是sayName(){},所以它在sayName中继承this,继承了cat的this
                    箭头函数是在sayName函数中定义的,this指向sayName的对象cat
                    */
                    console.log(this.name);//mao
                },1000);
            }
        };
        cat.sayName();
posted @ 2022-10-26 11:49  ben10044  阅读(28)  评论(0)    收藏  举报