第一步:
區(qū)分:函數(shù)聲明 / 函數(shù)表達(dá)式 / 匿名函數(shù)
函數(shù)聲明: 格式: function 函數(shù)名稱(){....};
使用function關(guān)鍵字聲明一個(gè)函數(shù),并指定一個(gè)函數(shù)名稱,叫做函數(shù)聲明;
函數(shù)表達(dá)式: 格式: var 函數(shù)名稱=function(){....};
使用function關(guān)鍵字聲明一個(gè)函數(shù),但未給函數(shù)命名,最后將函數(shù)賦予一個(gè)變量,叫做函數(shù)表達(dá)式;
匿名函數(shù):格式:function(){...};
使用function關(guān)鍵字聲明一個(gè)函數(shù),但沒有函數(shù)名稱,也沒賦予一個(gè)變量
函數(shù)聲明和函數(shù)表達(dá)式的不同之處:
一.JavaScript引擎在解析JavaScript代碼時(shí)會"函數(shù)聲明提升"當(dāng)前執(zhí)行環(huán)境(作用域)上的函數(shù)聲明,而函數(shù)表達(dá)式必須等到JavaScript引擎執(zhí)行到它時(shí),才會從上而下一行一行地解析函數(shù)表達(dá)式
二.函數(shù)表達(dá)式后面可以加括號立即調(diào)用該函數(shù),函數(shù)聲明只能以"函數(shù)名稱 ()"的形式調(diào)用
//函數(shù)聲明
aa();
function aa()
{
alert("1111");
}
//輸出1111
//函數(shù)表達(dá)式:
aa();
var aa=function()
{
alert("222222");
}
//報(bào)錯 aa不是一個(gè)函數(shù)
//匿名函數(shù)
function()
{
alert("3333");
}
//報(bào)錯
第二步
理解原理:(函數(shù)表達(dá)式)(); 第一個(gè)括號里必須是函數(shù)表達(dá)式,第二個(gè)括號里傳遞參數(shù);
第一種寫法(匿名函數(shù)(也屬于函數(shù)表達(dá)式)):
(function(a){
alert(a);
})(123)
第二種寫法(函數(shù)表達(dá)式):
(function(a){
alert(a);
}(123))
總結(jié):##
JavaScript中沒有私有域的概念,所以根據(jù)JavaScript函數(shù)作用域鏈的特性,可以使用這種技術(shù)模擬私有作用域,用匿名函數(shù)作為"容器","容器"內(nèi)可以訪問外部的變量,而外部環(huán)境不能訪問"容器"內(nèi)的變量
參照原文:深入理解javascript中的立即執(zhí)行函數(shù)(function(){…})()