定义函数的方式
- 函数声明(Function Declaration)
- 函数表达式(Function Expression)
- new Function构造函数
基本概念
函数声明:function fname(){…};使用function关键字声明一个函数,再指定一个函数名
函数表达式:var fname=function funame{…};使用function关键字声明一个函数,可以给函数命名也可以不给函数命名,最后将函数赋予给一个变量。
匿名函数:function(){};使用function关键字声明一个函数,但未给函数命名。(匿名函数也属于函数表达式,匿名函数的作用很多,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序等)
函数声明和函数表达式的区别:
1.函数声明提前。
2.函数表达式后面加()立即调用该函数,函数声明只能以fname()调用。
声明提前
表现:
- 变量声明会提前到函数的顶部
- 只是声明被提前,初始化不提前,初始化还在原来初始化的位置进行初始化
- 在初始化之前变量的值是undefined
var aerchi='aerchi';
function aerchiToShow(){
console.log(aerchi); // undefined
var aerchi='aerliho';
console.log(aerchi); //aerliho
}
aerchiToShow();
声明提前后的效果:
var aerchi='aerchi';
function aerchiToShow(){
var aerchi;//把变量aerchi的值变成了undefined
console.log(aerchi); // undefined
aerchi='aerliho';
console.log(aerchi); //aerliho
}
aerchiToShow();
函数调用
//可以在声明之前的位置被调用
var size=show("call before function");
function show(str){
console.log(str);
};
//可以在声明之后的位置被调用
var size2=show("call after function");
函数表达式
//会报错,变量aa 还未保存对函数的引用,函数调用必须在函数表达式之后
var aa = showM("call before function");
var showM = function(str){
console.log(str);
};
var showM = function(str){
console.log(str);
};
//只能在函数表达式定义之后被调用
var bb = showM("call after function");
立即执行函数(IIFE)
只有函数表达式才能实现立即执行
(function(a){ console.log(a); })(123);
(function(a){ console.log(a); }(1234));
!function(a){ console.log(a); }(12345);
+function(a){ console.log(a); }(123456);
-function(a){ console.log(a); }(1234567);
new function(a){ console.log(a); }(12345678);
匿名函数也是函数表达式为何不能立即执行呢,因为匿名函数开始的function会被JavaScript引擎识别为函数声明的开始,所以加上括号也不会被执行,而加上(),!,+,-等符号可以执行,是因为加上这些符号就可以告诉JavaScript引擎这不是函数声明了。
函数表达式的执行顺序
var getName = function () {
console.log('var getName 1');
};
function getName() {
console.log('function getName 1');
}
var getName = function () {
console.log('var getName 2'); //此函数表达式会被执行
};
function getName() {
console.log('function getName 2');
}
getName();
上述代码的执行结果是:var getName 2。
原因是这样的,var声明的变量和函数声明function都会被提升,但是函数声明的提升的级别是比var要高的.