一、定义函数

可以通过函数声明与函数表达式定义函数。

1. new + Function


var funcName = new **Function( [argname1, [… argnameN,]] body );
参数列表中可以有任意多的参数,然后紧跟着是函数体
如果函数体比较复杂,那拼接这个 String ,要花费很大的力气

  1. var add = new Function("x", "y", "return(x+y)");
  2. print(add(2, 4));

2. function 关键字 进行 函数声明

函数是由这样的方式进行声明的:关键字 function、函数名、一组参数,以及置于括号中的待执行代码。
函数的基本语法是这样的:

  1. function functionName(arg0, arg1, ... argN) {
  2. statements
  3. }
  1. function sayHi(sName, sMessage) {
  2. alert("Hello " + sName + sMessage);
  3. }

3.函数表达式

函数表达式看起来就像一个普通的变量定义和赋值,即创建一个 函数再把它赋值给一个变量 functionName 。这样创建的函数叫作 匿名函数(anonymous funtion)

  1. // 1.匿名函数表达式
  2. var anonymous = function() {
  3. return true;
  4. };
  5. var add = function(x, y){
  6. return x + y;
  7. }
  8. // 2.命名函数表达式
  9. var named = function named() {
  10. return true;
  11. };
  12. // 3.立即调用的函数表达式(IIFE) 也叫自执行函数
  13. 自执行函数有三种写法:
  14. ( function ( 参数 ) { " 函数方法 " ; } ) ( 给参数传的值 )
  15. ( function ( " 参数 " ) { 函数方法 ; } ( " 给参数传的值 " ) )
  16. ! function ( " 参数 " ) { " 函数方法 " ; } ( " 给参数传的值 " ) 
  17. (function () {
  18. console.log('Welcome to the Internet. Please follow me.');
  19. }());

函数声明与函数表达式的区别

JavaScript引擎在加载数据时对函数声明和函数表达式是区别对待的。JavaScript引 擎在任何代码执行之前,会先读取函数声明,并在执行上下文中生成 函数定义。而函数表达式必须等到代码执行到它那一行,才会在执行 上下文中生成函数定义。

  1. // 没问题
  2. console.log(sum(10, 10));
  3. function sum(num1, num2) {
  4. return num1 + num2;
  5. }

以上代码可以正常运行,因为函数声明会在任何代码执行之前先 被读取并添加到执行上下文。这个过程叫作函数声明提升(function declaration hoisting)。在执行代码时,JavaScript引擎会先执行一遍扫 描,把发现的函数声明提升到源代码树的顶部。因此即使函数定义出 现在调用它们的代码之后,引擎也会把函数声明提升到顶部。如果把 前面代码中的函数声明改为等价的函数表达式,那么执行的时候就会 出错

  1. // 会出错
  2. console.log(sum(10, 10));
  3. let sum = function(num1, num2) {
  4. return num1 + num2;
  5. };

除了函数什么时候真正有定义这个区别之外,这两种语法是等价的。

JavaScript 中,函数及变量的声明都将被提升到函数的最顶部,且函数提升的优先级高于变量提升。