大家好朗兵,我是IT修真院北京總院第22期的學(xué)員,一枚正直純潔善良的web程序員顶滩;
今天給大家分享一下,修真院官網(wǎng)js任務(wù)2寸爆,函數(shù)表達(dá)式和函數(shù)聲明有什么區(qū)別礁鲁?
1.背景介紹
什么是Function Declaration(函數(shù)聲明)盐欺?
Function Declaration可以定義命名的函數(shù)變量,而無(wú)需給變量賦值仅醇。Function Declaration是一種獨(dú)立的結(jié)構(gòu)冗美,不能嵌
套在非功能模塊中。
就是使用function關(guān)鍵字聲明一個(gè)函數(shù)析二,再指定一個(gè)函數(shù)名粉洼,叫函數(shù)聲明
什么是Function Expression(函數(shù)表達(dá)式)?
Function Expression將函數(shù)定義為表達(dá)式語(yǔ)句(通常是變量賦值)的一部分叶摄。通過(guò)Function Expression定義的函數(shù)可以
是命名的属韧,也可以是匿名的。Function Expression不能以“function”開(kāi)頭蛤吓。
使用function關(guān)鍵字聲明一個(gè)函數(shù)宵喂,但未給函數(shù)命名,最后將匿名函數(shù)賦予一個(gè)變量会傲,叫函數(shù)表達(dá)式
函數(shù)表達(dá)式存儲(chǔ)在變量后锅棕,變量也可作為一個(gè)函數(shù)使用:
var x = function (a, b) {return a * b};
alert= x(4, 3);
以上函數(shù)實(shí)際上是一個(gè) 匿名函數(shù)(函數(shù)沒(méi)有名稱(chēng))。
函數(shù)存儲(chǔ)在變量中淌山,不需要函數(shù)名稱(chēng)裸燎,通常通過(guò)變量名來(lái)調(diào)用。
var x = function (a, b) {return a * b};
var z = x(4, 3);
alert= z;
2.知識(shí)剖析
//函數(shù)聲明
function funDeclaration(type){
return type==="Declaration";
}
//函數(shù)表達(dá)式
var funExpression = function(type){
return type==="Expression";
}
3.常見(jiàn)問(wèn)題
一泼疑、什么是JavaScript函數(shù)顺少?
二、兩者具體有哪些區(qū)別呢王浴?
4.解決方案
一脆炎、JavaScript函數(shù)。
函數(shù)是由事件驅(qū)動(dòng)的或者當(dāng)它被調(diào)用時(shí)執(zhí)行的可重復(fù)使用的代碼塊氓辣。
JavaScript函數(shù)語(yǔ)法
函數(shù)就是包裹在花括號(hào)中的代碼塊秒裕,使用了關(guān)鍵詞function:
function functionname()
{
執(zhí)行代碼
}
當(dāng)調(diào)用該函數(shù)時(shí),會(huì)執(zhí)行函數(shù)內(nèi)的代碼钞啸。
可以在某事件發(fā)生時(shí)直接調(diào)用函數(shù)(比如當(dāng)用戶點(diǎn)擊按鈕時(shí))几蜻,并且可由JavaScript在任何位置進(jìn)行調(diào)用。
JavaScript對(duì)大小寫(xiě)敏感体斩。關(guān)鍵詞function必須是小寫(xiě)的梭稚,并且必須以與函數(shù)名稱(chēng)相同的大小寫(xiě)來(lái)調(diào)用函數(shù)。
調(diào)用帶參數(shù)的函數(shù),在調(diào)用函數(shù)時(shí)絮吵,您可以向其傳遞值弧烤,這些值被稱(chēng)為參數(shù)。
這些參數(shù)可以在函數(shù)中使用蹬敲。
您可以發(fā)送任意多的參數(shù)暇昂,由逗號(hào)(,)分隔:
myFunction(argument1,argument2)
當(dāng)聲明函數(shù)時(shí)莺戒,把參數(shù)作為變量來(lái)聲明:
function myFunction(var1,var2)
{
代碼
}
點(diǎn)擊這個(gè)按鈕,來(lái)調(diào)用帶參數(shù)的函數(shù)急波。
functionmyFunction(name,job){
alert("Welcome "+ name +", the "+ job);
}
二从铲、函數(shù)聲明中函數(shù)名是必須的;函數(shù)表達(dá)式中則是可選的
//函數(shù)聲明
function sum(a, b) {
return a + b;
}
alert(sum(1, 2));
//函數(shù)表達(dá)式
var s = function sum(a, b) {
return a + b;
}
alert(s(1, 2));
var s = function(a, b) {
return a + b;
}
alert(s(1, 2));//以上兩種都可以
二澄暮、用函數(shù)聲明定義的函數(shù),函數(shù)可以在函數(shù)聲明之前調(diào)用,而用函數(shù)表達(dá)式定義的函數(shù)只能在聲明之后調(diào)用名段。
//函數(shù)聲明
alert(sum(1, 2));//3
function sum(a, b) {
return a + b;
}
//函數(shù)表達(dá)式:發(fā)生錯(cuò)誤
try {
alert(s(1, 2));
var s = function sum(a, b) {
return a + b;
}
}
catch (e) {
alert("wrong!");
}
5.擴(kuò)展思考
使用function關(guān)鍵字聲明一個(gè)函數(shù),再指定一個(gè)函數(shù)名泣懊,叫函數(shù)聲明伸辟。
function fn(){……}
使用function關(guān)鍵字聲明一個(gè)函數(shù),但未給函數(shù)命名嗅定,最后將匿名函數(shù)賦予一個(gè)變量自娩,叫函數(shù)表達(dá)式。
var fn=function(){……}
使用function關(guān)鍵字聲明一個(gè)函數(shù)渠退,但未給函數(shù)命名,這個(gè)又稱(chēng)之為什么呢忙迁?是屬于以上兩種類(lèi)型的哪一種?
function(){……}
匿名函數(shù)屬于函數(shù)表達(dá)式碎乃,匿名函數(shù)有很多作用姊扔,賦予一個(gè)變量則創(chuàng)建函數(shù),賦予一個(gè)事件則成為事件處理程序或創(chuàng)建閉包等等.
6.參考文獻(xiàn)
參考一:函數(shù)聲明與函數(shù)表達(dá)式以及立即執(zhí)行函數(shù)的討論
參考二:雨落川下雪
7.更多討論
問(wèn)題一:關(guān)于立即執(zhí)行函數(shù)的討論
回答:也就是說(shuō)只有函數(shù)表達(dá)式才能實(shí)現(xiàn)立即執(zhí)行梅誓,匿名函數(shù)也是函數(shù)表達(dá)式為何不能立即執(zhí)行呢恰梢,
因?yàn)槟涿瘮?shù)開(kāi)始的function會(huì)被JavaScript引擎識(shí)別為函數(shù)聲明的開(kāi)始,所以加上括號(hào)也不會(huì)被執(zhí)行了梗掰,
而加上()嵌言,!及穗,+摧茴,-等符號(hào)為什么就可以了呢,因?yàn)榧由线@些符號(hào)就可以告訴JavaScript引擎這不是函數(shù)聲明了埂陆。
問(wèn)題二:給匿名函數(shù)用小括號(hào)包起來(lái)苛白,為什么能執(zhí)行?
//匿名函數(shù):
function(){ ? //如果不加小括號(hào)則會(huì)報(bào)錯(cuò)焚虱!
alert('彈出框');
}();
//添加小括號(hào)后的匿名函數(shù)
(function(){
alert('彈出框');
})();
回答:小括號(hào)能把我們的表達(dá)式組合分塊购裙,并且每一塊,也就是每一對(duì)小括號(hào)鹃栽,都有一個(gè)返回值躏率。這個(gè)返回值實(shí)際上也就是小括號(hào)中表達(dá)式的返回值。
問(wèn)題三:什么是自執(zhí)行函數(shù)?
回答:在JavaScript里禾锤,任何function在執(zhí)行的時(shí)候都會(huì)創(chuàng)建一個(gè)執(zhí)行上下文私股,因?yàn)闉閒unction聲明的變量和function有可能只在該function內(nèi)部摹察,這個(gè)上下文恩掷,在調(diào)用function的時(shí)候,提供了一種簡(jiǎn)單的方式來(lái)創(chuàng)建自由變量或私有子function供嚎。
8.問(wèn)題截圖
9:鳴謝
感謝 孫劍立黄娘,此教程在她技術(shù)分享的基礎(chǔ)上完善而成!
視屏地址:鏈接:
------------------------------------------------------------------------------------------------------------------------------------------
“我們相信人人都可以成為一個(gè)工程師克滴,現(xiàn)在開(kāi)始逼争,找個(gè)師兄,帶你入門(mén)劝赔,掌控自己學(xué)習(xí)的節(jié)奏誓焦,學(xué)習(xí)的路上不再迷茫”着帽。
這里是技能樹(shù).IT修真院杂伟,成千上萬(wàn)的師兄在這里找到了自己的學(xué)習(xí)路線,學(xué)習(xí)透明化仍翰,成長(zhǎng)可見(jiàn)化赫粥,師兄1對(duì)1免費(fèi)指導(dǎo)∮杞瑁快來(lái)與我一起學(xué)習(xí)吧 越平!