• 在JavaScript中创建函数通常有三种方式:函数声明方式、函数表达式方式、构造函数方式。

1. 函数声明方式

  • 函数声明方式即使用关键字function来创建函数。
  • 语法:
function  函数名( 形参1, 形参2, … ){
	  函数体
      return 返回值
	};
  • 注意:
    使用函数声明方式会出现函数声明提前的问题。
  • 声明提前(hoist):声明提前有两种,分别是变量声明提升和函数声明提升。
  • 在JavaScript程序开始执行前,JavaScript引擎会查找到程序中所有的var关键字声明的变量和function关键字声明的函数(函数声明方式创建的函数),会将其集中提前到当前作用域的顶部集中创建。
    其中将var关键字声明的变量提前称为变量声明提升,而将function关键字声明的函数提升称为函数声明提升。
  • 两者间的区别:变量提升(var关键字)只提升了变量的声明,但是赋值操作不会被提前(即var关键字的赋值操作没有被提前)。

2. 函数表达式方式

  • 由于在使用函数声明方式创建函数会出现函数声明提升的问题,而此问题往往会破坏程序的正常执行顺序,极易产生歧义,因此可以使用函数表达式方式创建函数。
  • 函数表达方式指使用直接量赋值方式创建函数。由于通过赋值的方式来创建函数,所以函数不会被提前声明,会按照程序书写的顺序执行。
  • 语法:
let 函数名 = function(参数1,参数2,……){
  		函数体;
  		return 返回值;
	};

3. 构造函数方式

  • 构造函数方式即指使用Function构造方法创建函数。
  • 语法:
let 函数名= new Function(“形参1”, “形参2”,… , “函数体”);
  • Function构造函数可以接收任意数量的参数,但最后一个参数始终被看成函数体,而前面的参数则枚举出新函数的参数。
  • 从技术角度来说,不推荐使用该方法创建函数,因为这种语法会导致解析两次代码(第一次是解析常规的ECMAScript代码,第二次是解析传入构造函数中的字符串),从而影响性能,效率低下,且可读性也比较差,所以很少使用。