先mark
回头整理一下
原文链接:http://blog.csdn.net/macguffinbox/article/details/53808766
在理解自我执行函数之前我们先理解一下函数声明函数,函数表达式,匿名函数他们之间的区别
运用function fname(){.......} //使用function关键字,然后指定函数名,这叫做函数声明。
var fnname=function (){....} //使用function关键字,但是没有指定函数名,而是将他赋给变量,这件函数表达式。
function(){......} //使用关键字function,但是没有指定函数名,这就叫做匿名函数,匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序。
函数声明和函数表达式的区别在于
---一 函数声明,在当前代码执行的执行环境(作用域)内的函数声明会有一个函数声明提升(function declaration hositing)而函数表达式必须等到代码执行到函数表达式所在的行的时候一行一行的执行
---另一个区别就是如果想调用函数声明的函数----函数名+(),而函数表达式后面直接加()就会立马调用
x(5);//5声明函数会提前
function x(num){alert num}
x(5);//x is not a function函数表达式没声明提前
var x=functoin(num){alert num}
var x=function(num){alert num}
x(5);//5
var x=function(num){alert num}(5);//立即执行
function x(num){alert num}(5);//无法执行,但不会抛出错误,会忽略后面括号
function (){alert num}();//语法错误,匿名函数虽然属于函数表达式,但没有赋值操作
//javascript解析会把function当做函数声明,要求一个函数名
理解以上概念以后,我们为你再来看看两种自定执行函数(function (){})()和(function(){})
我们发现只要是函数表达式后面加括号这个函数都会立即执行,但是函数声明后面加括号却不行,对于匿名函数后面加上()以后会爆出语法错误,引擎会误认为是函数声明但缺少函数名,那么我们加上某些运算符来告诉引擎它不是函数声明即可
+function(num){alert (num)}(5);//5
(function(num){alert (num)})(5);//5
(function(num){alert (num)}(5));//5