在 JavaScript中,函数是头等(first-class)对象,一等公民,因为它们可以像任何其他对象一样具有属性和方法。它们与其他对象的区别在于函数可以被调用。
函数的定义
在javascript
中,函数是由事件驱动的或者当它被调用时执行的可重复使用的代码快。当今任何一个javascript
框架或者库,都是由成千上万个函数组成,比如jquery
、react
、vue
等。通过使用函数可以更加合理的组织代码,不仅提高了代码的可读性,也为程序扩展提供了可能。通常根据定义函数的方式不同,将函数分为声明式函数和表达式函数。
声明式函数
声明式函数相对于表达式函数而言又被称作具名函数,定义格式如下:
1 | function funcname([arg1[,arg2……]]){ |
funcname
是一个标识符,是定义的函数名,不是字符串也不是变量。紧跟后面的括号中是函数的参数,大括号中是函数体。当函数被调用时,传入参数并执行函数体中的代码。
1 | function add(x,y){ |
表达式函数
表达式函数可以定义一个匿名函数(表达式函数可以带函数名,但是函数名只能在函数内部使用,相对于全局来说是匿名的)
- 示例1(没有函数名)
1 | // add指向存储匿名函数的地址 |
- 示例2(提供函数名的时候,函数名只可以在函数内部使用来代指函数本身)
1 |
|
- 需要注意的是,使用
Function
构造函数也可以定义表达式,使用该方式定义函数允许我们动态的来定义和编译一个函数,而不是限定在function
预编译的函数体中。但同时也会带来负面影响,因为每次调用都要对它进行编译并生成新的函数对象,尤其是在循环体中,效率相对较低。不推荐使用,了解即可
1 | // 使用new Function创建一个函数 |
- Function()构造函数定义的函数是全局作用域的
1 | var y = "global"; |
c()()
打印global
,因为Function()返回的是全局变量y,而不是函数体内的局部变量。
声明式函数和表达式函数的区别
最主要的区别是加载顺序有所不同,声明式函数是在 JavaScript 编译的时候就加载到作用域中,而表达式函数则是在代码执行的时候加载,如果在定义之前调用表达式函数,则会返回 undefined;这就是通常说的函数声明提升
1 | console.log(typeof f);//function |