三种常用的函数定义方式

2022/9/21

js中函数也是一个对象,我们可以通过调用构造函数即new Function()的方式来定义,但是在 JavaScript 中,很多时候要尽量避免使用 new 关键字,因此这种方式并不推荐,了解即可。通常使用以下三种定义方式。

命名函数
即最基本的函数形式,语法为

function methodName(参数){
    方法体;
}
对于函数的参数

//在ES6之前,这样来给参数赋予默认值
function add(a, b){
    a = a || 5; //如果a是undefined,则默认值为5。已定义则按已定义的来
    b = b || 3; //如果b是undefined,则默认值为3。已定义则按已定义的来
}
 
//在ES6中,直接在参数定义处(会默认定义,不能重复定义该变量)赋值即可
function add(a = 5, b = 3){ //如果参数是undefined,则给默认值。已定义则按已定义的来
    
}
调用函数时如果要给参数赋值,比如add(6, 8),则结果为14;

允许直接给前面的值传参,比如add(0),则结果为3;

但是不允许跳过前面的参数直接给后面的参数赋值,比如add(,4)就是错的,此时必须指定前面的参数为undefined,比如add(undefined,4)。

匿名函数
命名函数可以多次调用。但有些时候需要临时用一些函数,则不必使用命名函数,直接使用匿名函数即可。匿名函数仅能使用一次。

function(参数){
    方法体;
}
事实上,我们也可以将匿名函数赋给一个变量,以这个变量作为方法名(此时其实也算不上匿名)

const add = function(a, b){
    return a + b;
}
 
//调用
add();
箭头函数
用于简化匿名函数。

    <script>
        const numbers = [10, 20, 21, 30, 25, 26];
       
        //此处调用map方法,传递一个回调函数
        const result1 = numbers.map(function(number){
            return number;
        });
 
        //使用箭头来简化函数
        const result2 = numbers.map(number => {
            return number;
        });
     </script>
使用箭头函数的时候要注意几个问题

1、去掉function关键字,改用箭头的形式时,箭头从形参指向方法体。

2、如果参数只有一个,可以去掉参数的括号。

3、如果参数有多个,括号不能去掉。

4、如果没有参数,括号不能去掉。

5、如果语句体有且仅有一个return语句,则花括号和return关键字可以省略。

箭头函数中的this引用
如果在一个对象内使用this,通常指的就是对该对象本身的引用。如果在该对象内有一个函数,函数里面调用函数时再使用this,由于此时函数是独立的,所以函数里面的this会指向全局windows对象。

总结来说就是箭头函数中的this引用会指向父级域。匿名函数的this表示当前域,如果当前不属于任何父级域,则属于window。



但是如果函数里面调用的是箭头函数,那么this则表示的是当前对象



普通函数中的this:谁调用函数,this就代表谁。

箭头函数中的this:可以固定this的值,函数在哪定义的,就表示哪个的父级域。不会随着调用者而改变。

什么时候不能使用箭头函数
当你需要将this绑定到当前对象,但是this指向的父级域却不是当前对象时不要使用箭头函数。

另外需要使用arguments对象时不要使用箭头函数,因为箭头函数中没有arguments对象。(arguments对象是一个隐藏的数组对象,封装了所有接收到的参数)

函数如何接收数据
我的理解是,函数要接收的数据都会存放在arguments中,我们要想正确获取对应的数据,在函数的形参定义时,要么保证获取数据的顺序,要么采取和原变量相同的名称来接收。