函数定义和函数表达式
函数定义
例题1:
//不会报错,因为"提升了"函数声明,函数调用可在函数声明之前
fn1();
function fn1(){
console.log("这里是函数定义");
}
函数表达式
例题1:
fn2();
//会报错(错误信息:“fn2 is not a function”),变量fn2还未保存对函数的引用,函数调用必须在函数表达式之后
var fn2=function(){
console.log("这里是函数表达式");
}
立即执行函数
//情况1:当圆括号放在一个函数表达式后面指明了这是一个被调用的函数,
//结果会被输出
var fn=function(){
console.log("函数表达式赋值给一个变量");
}();
//情况2
//报错,结果不会被输出,JavaScript引擎只解析函数声明,忽略后面的括号,函数声明不会被调用
//(函数声明不可以直接被调用,只有函数表达式才可以立即执行)
//注意:这里的function是一个声明,紧跟着的圆括号是无效的,因为圆括号里需要包含表达式
function fn(){
console.log("函数声明");
}();
//情况2-1:圆括号放在一个声明后面便意味着完全的和前面的函数声明分开了,此时圆括号只是一个
//简单的代表一个括号(用来控制运算优先的括号)。
//不报错,结果不会被输出,js引擎会将(1,2,3)看做一个逗号表达式
function fn(){
console.log("函数声明");
}(1,2,3);
//情况3
//语法错误,匿名函数属于函数表达式,未执行赋值操作,不能被调用
/**
**当圆括号为了调用函数出现在函数后面时,无论在全局环境或者局部环境里遇到了这样的function关键
字,默认的,它会将它当作是一个函数声明,而不是函数表达式,如果你不明确的告诉圆括号它是一个表达
式,它会将其当作没有名字的函数声明并且抛出一个错误,因为函数声明需要一个名字。
**/
function(){
console.log("函数表达式");
}();
要知道的:只有函数表达式才能实现立即执行
匿名函数也是函数表达式,但是它不可以立即执行。
原因:因为匿名函数开始的function会被JavaScript引擎识别为函数声明的开始,所以加上括号也不会被执行了(也就是情况3),而加上(),!,+,-等符号为什么就可以了呢,因为加上这些符号就可以告诉JavaScript引擎这不是函数声明了
将函数声明包裹在圆括号里来告诉语法分析器去表达一个函数表达式,因为在JavaScript里,圆括号不能包含声明。因为这点,当圆括号为了包裹函数碰上了 function关键词,它便知道将它作为一个函数表达式去解析而不是函数声明
注意:
- 当圆括号出现在匿名函数的末尾想要调用函数时,它会默认将函数当成是函数声明。
- 当圆括号包裹函数时,它会默认将函数作为表达式去解析,而不是函数声明
立即函数经典样式
//样式1(推荐使用)
(function fun(){
console.log('1');
}());
//样式2
(function fun(){
console.log('2');
})();
//样式3
!function fun(){
console.log('3');
}()
//样式4
+function fun(){
console.log('4');
}()
//样式5
*function fun(){
console.log('5');
}()
....