立即执行函数

(function(){...})()和(function(){...}())是两种js立即执行函数的常见写法,为什么要加括号呢

函数声明、函数表达式、匿名函数

函数声明:function fnName(){...};使用function关键字声明一个函数,再指定一个函数名,叫函数声明

函数表达式:var fnName = function(){...};使用function关键字声明一个函数,但未给其命名,将它赋值给一个变量,叫函数表达式

匿名函数:function(){};使用function关键字声明一个函数,但未给命名,所以叫匿名函数。它也属于函数表达式

函数声明和函数表达式不同之处:①js引擎在解析代码时会‘函数声明提升’(function declaration hoisting)即会最先解析函数声明,而函数表达式还是按规矩由上而下逐行解析②函数表达式后面可以加括号立即执行,函数声明只能以fnName()形式调用

fnName();
function fnName(){
    ...
}//正常,因为‘提升’了函数声明,函数调用可在函数声明之前
 
fnName();
var fnName=function(){
    ...
}//报错,变量fnName还未保存对函数的引用,函数调用必须在函数表达式之后

var fnName=function(){
    alert('Hello World');
}();//函数表达式后面加括号,当javascript引擎解析到此处时能立即调用函数 注意这里fnName等于
  //函数执行的返回值

function fnName(){
    alert('Hello World');
}();//不会报错,但是javascript引擎只解析函数声明,忽略后面的括号,函数声明不会被调用

function(){
    console.log('Hello World');    
}();//语法错误,虽然匿名函数属于函数表达式,但是未进行赋值操作,
//所以javascript引擎将开头的function关键字当做函数声明,报错:要求需要一个函数名

至于文章开头的两种表达方式,就跟在匿名函数前面加!、+、-一样是起到消除js引擎识别歧义,告诉js引擎这是一个函数表达式。

当然,这其中加括号是最安全的做法,因为!、+、-等运算符会对函数返回值进行运算

猜你喜欢

转载自xiaoxiaoher.iteye.com/blog/2347870