- 函数声明
function funcName(){
};
console.log(funcName); // 打印效果是funcName这个函数体。
声明一个函数funcName,funcName就是函数名,函数名是函数声明的必要组成部分,函数实在就是另一个范例的变量,函数称号相当于变量名,新声明的函数体味赋值给这个变量名,以后挪用该函数的时刻都须要经由过程该变量名举行挪用。
- 函数表达式
// 定名函数表达式
var funcName = function abc() {};
console.log(funcName); // 打印函数体function abc(){}
console.log(abc); // 报错(abc is not defined)
在这个函数表达式中,函数称号为abc,实在上,这个称号abc变成了函数内部的一个局部变量,而且指代函数对象自身,在abc函数内部打印abc的打印效果是abc函数体自身。
var funcName = function abc() {
console.log(abc); // 打印效果是function abc() {console.log(abc)}
};
所以,在全局console.log(abc);肯定会报错,由于abc是局部变量,全局是拿不到的,这个函数表达式会疏忽函数的称号,挪用的时刻要经由过程变量名举行挪用——funcName();
// 匿名函数表达式
var funcName = function () {};
匿名函数表达式望文生义就是没有名字的函数表达式,平常情况下,我们所说函数表达式就指匿名函数表达式,由于函数表达式会疏忽函数的称号,会变成匿名函数表达式,不如直接写成匿名函数表达式。
函数表达式与函数声明差别的是,函数声明只是声清楚明了一个函数,在预编译的时刻,函数声明的声明提拔函数体也提拔,所以不论你是在函数声明之前挪用照样在以后挪用,都能一般实行。
demo(); // 效果是'a'
function demo(){
console.log('a');
};
demo(); // 效果是'a'
而函数表达式在预编译时,是变量名提拔,只要当实行到函数表达式所在行的代码时,才将函数体赋值给该变量,所以在函数表达式之前挪用该函数会报错,只能在以后挪用。
demo(); // 报错
var demo = function (){
console.log('a')
};
demo(); // 效果是'a'
- 匿名函数
匿名函数望文生义就是没有名字的函数。(匿名函数有多种用处,写在文末)
function () {};
既然是没有名字的函数,那我们要如何找到它挪用它呢?这里要提到两种要领。
第一种要领是上面已说到的匿名函数表达式,行将匿名函数赋值给一个变量,然后经由过程变量名去挪用。
var abc = function (){};
abc();
第二种要领就是接下来要说的马上实行函数。
- 马上实行函数
马上实行函数有两种写法:
// 第一种 w3c规范发起运用这一种
(function (){})();
// 第二种
(function(){}());
这里有两个括号有点疑问,在诠释两个括号的作用前,我们先明白几点:
1.只要表达式才被实行标记实行,函数声明是不能被实行标记实行的。
2.能被实行标记实行的表达式,这个函数的名字就会被自动疏忽(摒弃名字)。
3.能被实行标记实行的表达式基本上就是马上实行函数。
由于函数声明是不能被实行标记实行的,除非经由过程函数名挪用,只要表达式才被实行标记实行(匿名函数又没有函数名,别的的方法就是把它变成表达式)。
function (){
console.log('a'); // 报语法毛病,由于只要表达式才被实行标记()实行
}();
(function (){})()
所以此处匿名函数双方的括号运算符,作用是把函数转换为表达式(至于如何转换的,更深层的道理有兴致的童鞋能够研讨研讨,后续我会举行补充的),背面的括号为实行标记,(function (){})()就相当于匿名函数表达式的实行。
(function (){})()和(function(){}())写法实在没多大区分,(function(){}())也是一向等价的表达式,然则w3c规范发起运用第一种。
将函数声明转化成表达式的体式格局有许多,比方把它赋值给一个变量,再比方在函数声明前放上+运算符,-运算符,!运算符等。
// 把它赋值给一个变量
var demo = function(a){
console.log(a); // 效果为1
}(1)
// 运用+运算符
+function(a){
console.log(a); // 效果为1
}(1);
// 运用-运算符
-function(a){
console.log(a); // 效果为1
}(1);
// 运用!运算符
!function(a){
console.log(a); // 效果为1
}(1);
当表达式被实行,函数的名字就会被摒弃,举两个栗子:
var demo = function(){}();
console.log(demo); // 效果会报错,由于函数名被摒弃了。
+function demo(){}();
console.log(demo); // 效果会报错,由于函数名被摒弃了。
匿名函数有许多作用,比方将匿名函数给予一个变量来建立一个函数,比方给予一个事宜则成为事宜处置惩罚顺序,再比方用马上实行函数建立闭包防备污染全局变量等等
// 将匿名函数给予一个变量来建立一个函数
var demo = function(){};
// 给予一个事宜则成为事宜处置惩罚顺序
$(selector).on('click',function(){});
// 用马上实行函数建立闭包
(function(window, undefined))(window);
本文只是简朴剖析以助本身理清思绪,有毛病的地方请不吝赐教。