1.函数声明javascript
函数声明以function关键字开头,接着是必须的函数(变量)名和以逗号分隔的可选的参数列表,再接着就是以大括号封装的函数体。函数声明必须是一个单独的JavaScript语句。java
基本语法:函数
function funName(arg1,arg2){ //... }
另外,须要注意的是,函数在运行时全部声明变量或声明函数都会被提高到当前函数的顶部。
例以下代码:spa
console.log('m' in window);//true
var m = 0;
代码执行时js引擎会将声明语句提高至代码最上方,变为:code
var m; console.log('m' in window);//true m = 0;
2.函数表达式blog
在任何状况下都是其它JavaScript语句的一部分(好比赋值表达式等号的右侧、函数的参数)的函数被称为函数表达式。ip
函数表达式最大的问题,在于js会将此代码拆分为两行代码分别执行。it
例以下代码:io
console.log(m);//输出:function m(){} var m=1; function m(){}
实际执行的代码为,先将 var m=1 拆分为 var m; 和 m = 1; 两行,再将 var m; 和 function m(){} 两行提高至最上方变成:console
var m; function m(){} console.log(m); m=1;
因此最终函数声明的m覆盖了变量声明的m,输出结果为m函数。
m();//m is not defined var m = function(){ console.log('n'); } 这个例子里虽然变量m声明提早了,但其后面所接函数表达式仍在原来的位置,因此结果会报错。
3.比较
//函数声明 function myFunctionDeclaration(){ function innerFunction() {} } //如下为函数表达式 var myFunc = function(){}; myFunc(function(){ return function(){}; }); (function namedFunctionExpression () { })(); +function(){}(); -function(){}(); !function(){}(); ~function(){}();
myFunctionDeclaration 是一个包含其它函数声明(innerFunction)的函数声明
函数表达式老是其它JavaScript语句的一部分,好比变量声明等号的右侧:
var myFunc = function(){};
或者其余函数的参数:
myFunc(function() {
return function(){};
});
或者当即执行函数:
(function namedFunctionExpression () { })();
或者被为运算符修饰:
+function(){}();
函数声明与函数表达式除了以代码放的位置不一样区别,还有一点不一样,那就是函数声明必须有函数名,而函数表达式的函数名能够省略。
函数声明必须有函数名是由于函数被调用的基本要求,在调用一个函数时咱们必须可以引用它,而惟一的方法就是经过函数名。
函数表达式是其它JavaScript语句的一部分,因此咱们有别的方式引用它们,好比函数被赋值给一个变量,能够经过变量名来访问:
var doNothing = function(){}; doNothing();
或者做为其它函数的参数,能够经过参数名访问:
function doSomething(action) { action(); } 关于当即执行函数: 当即执行函数必须用括号包裹,缘由很简单,JavaScript解析器须要区分函数声明和函数表达式,若是省略函数外边的括号,而且直接调用( function(){}(2)此处函数外面没有括号),JavaScript解析器开始解析,而且结束执行,由于这条语句是以function关键字开始,被看成函数声明,因为函数声明必需要有函数名,所以会抛出异常。函数外边的括号会给JavaScript解析器这是一个函数表达式的信号。为了达到相同的目的,也能够这样写:(function (a){}(3)),括号的做用和上面相同。位运算符的做用和上面也是相同的。