一、定义函数
1. new + Function
var funcName = new **Function( [argname1, [… argnameN,]] body );
参数列表中可以有任意多的参数,然后紧跟着是函数体
如果函数体比较复杂,那拼接这个 String ,要花费很大的力气
var add = new Function("x", "y", "return(x+y)");print(add(2, 4));
2. function 关键字 进行 函数声明
函数是由这样的方式进行声明的:关键字 function、函数名、一组参数,以及置于括号中的待执行代码。
函数的基本语法是这样的:
function functionName(arg0, arg1, ... argN) {statements}
function sayHi(sName, sMessage) {alert("Hello " + sName + sMessage);}
3.函数表达式
函数表达式看起来就像一个普通的变量定义和赋值,即创建一个 函数再把它赋值给一个变量 functionName 。这样创建的函数叫作 匿名函数(anonymous funtion)
// 1.匿名函数表达式var anonymous = function() {return true;};var add = function(x, y){return x + y;}// 2.命名函数表达式var named = function named() {return true;};// 3.立即调用的函数表达式(IIFE) 也叫自执行函数自执行函数有三种写法:( function ( “ 参数 ” ) { " 函数方法 " ; } ) ( “ 给参数传的值 ” )( function ( " 参数 " ) { “ 函数方法 ” ; } ( " 给参数传的值 " ) )! function ( " 参数 " ) { " 函数方法 " ; } ( " 给参数传的值 " )(function () {console.log('Welcome to the Internet. Please follow me.');}());
函数声明与函数表达式的区别
JavaScript引擎在加载数据时对函数声明和函数表达式是区别对待的。JavaScript引 擎在任何代码执行之前,会先读取函数声明,并在执行上下文中生成 函数定义。而函数表达式必须等到代码执行到它那一行,才会在执行 上下文中生成函数定义。
// 没问题console.log(sum(10, 10));function sum(num1, num2) {return num1 + num2;}
以上代码可以正常运行,因为函数声明会在任何代码执行之前先 被读取并添加到执行上下文。这个过程叫作函数声明提升(function declaration hoisting)。在执行代码时,JavaScript引擎会先执行一遍扫 描,把发现的函数声明提升到源代码树的顶部。因此即使函数定义出 现在调用它们的代码之后,引擎也会把函数声明提升到顶部。如果把 前面代码中的函数声明改为等价的函数表达式,那么执行的时候就会 出错
// 会出错console.log(sum(10, 10));let sum = function(num1, num2) {return num1 + num2;};
除了函数什么时候真正有定义这个区别之外,这两种语法是等价的。
JavaScript 中,函数及变量的声明都将被提升到函数的最顶部,且函数提升的优先级高于变量提升。
