摘要:關(guān)鍵詞必須是小寫的,并且必須以與函數(shù)名稱相同的大小寫來調(diào)用函數(shù)。當(dāng)調(diào)用函數(shù)時,這些標(biāo)識符則指代傳入函數(shù)的實參。函數(shù)表達(dá)式其實是忽略函數(shù)名稱的,并且不可以使用函數(shù)名這種形式調(diào)用函數(shù)。注意構(gòu)造函數(shù)無法指定函數(shù)名稱,它創(chuàng)建的是一個匿名函數(shù)。
一、關(guān)于函數(shù)
JavaScript函數(shù)是指一個特定代碼塊,可能包含多條語句,可以通過名字來供其他語句調(diào)用以執(zhí)行函數(shù)包含的代碼語句。
比如我們有一個特定的功能需要三條語句實現(xiàn)
那么每次想實現(xiàn)這個功能的時候就需要寫這三句話,很麻煩,我們可以把這三條語句打包為一個函數(shù)
這樣每次想實現(xiàn)功能的時候我們就調(diào)用一下函數(shù)就可以了,調(diào)用函數(shù)通過函數(shù)名稱()的形式調(diào)用
二、聲明方式ECMA規(guī)范只明確了一點:函數(shù)聲明必須帶有標(biāo)示符(Identifier)(就是大家常說的函數(shù)名稱),而函數(shù)表達(dá)式則可以省略這個標(biāo)示符。2.1 規(guī)則
(1)函數(shù)聲明只能出現(xiàn)在 程序或函數(shù)體內(nèi)。從句法上講,它們不能出現(xiàn)在 Block(塊)({ ... })中,例如不能出現(xiàn)在 if、while 或 for 語句中。因為 Block(塊)中只能包含Statement語句, 而不能包含函數(shù)聲明這樣的源元素。
(2)另一方面,仔細(xì)看一看規(guī)則也會發(fā)現(xiàn),唯一可能讓表達(dá)式出現(xiàn)在Block(塊)中情形,就是讓它作為表達(dá)式語句的一部分。但是,規(guī)范明確規(guī)定了表達(dá)式語句不能以關(guān)鍵字function開頭。而這實際上就是說,函數(shù)表達(dá)式同樣也不能出現(xiàn)在Statement語句或Block(塊)中(因為Block(塊)就是由Statement語句構(gòu)成的)。
三、函數(shù)聲明(function 命令) 3.1 示例上面的代碼命名了一個job函數(shù),以后使用job()這種形式,就可以調(diào)用相應(yīng)的代碼。這叫做函數(shù)的聲明(Function Declaration)。
3.2 注意(1)JavaScript 對大小寫敏感。關(guān)鍵詞 function 必須是小寫的,并且必須以與函數(shù)名稱相同的大小寫來調(diào)用函數(shù)。
(2)funcname是要聲明的函數(shù)名稱的標(biāo)識符。函數(shù)名之后的圓括號中是參數(shù)列表,參數(shù)之間使用逗號分隔。當(dāng)調(diào)用函數(shù)時,這些標(biāo)識符則指代傳入函數(shù)的實參。
(3)function語句里的花括號是必需的,這和while循環(huán)和其他一些語句所使用的語句塊是不同的,即使函數(shù)體內(nèi)只包含一條語句,仍然必須使用花括號將其括起來。
四、函數(shù)表達(dá)式 (變量賦值) 4.1 定義不以function開頭的函數(shù)語句就是函數(shù)表達(dá)式。4.2 匿名函數(shù)表達(dá)式
以表達(dá)式方式定義的函數(shù),函數(shù)的名稱是可選的,下面是匿名函數(shù)的一個例子,也就是函數(shù)沒有名字
這種形式看起來好像是常規(guī)的變量賦值語句,即創(chuàng)建一個函數(shù)并將它賦值給變量myFunction。這種情況下創(chuàng)建的函數(shù)叫做匿名函數(shù)。因為function關(guān)鍵字后面沒有標(biāo)識符。
4.3 命名函數(shù)表達(dá)式當(dāng)然function命令后面也可帶有函數(shù)名,下面是在定義時為函數(shù)命名的例子
(1)命名函數(shù)表達(dá)式的好處是當(dāng)我們遇到錯誤時,堆棧跟蹤會顯示函數(shù)名,容易尋找錯誤。
(2)函數(shù)表達(dá)式其實是“忽略”函數(shù)名稱的,并且不可以使用函數(shù)名()這種形式調(diào)用函數(shù)。
4.4 被括號括住的(function foo(){})這種函數(shù)表達(dá)式不太常見,他是表達(dá)式的原因是因為括號 ()是一個分組操作符,它的內(nèi)部只能包含表達(dá)式。
4.5 注意(1)函數(shù)表達(dá)式不會放到開頭,所以不能在定義之前調(diào)用。
(2)若命名函數(shù)表達(dá)式(加上函數(shù)名),則函數(shù)名只在函數(shù)體內(nèi)部有效,在函數(shù)體外部無效。
上面代碼在函數(shù)表達(dá)式中,加入了函數(shù)名 x。這個 x 只在函數(shù)體內(nèi)部可用,指代函數(shù)表達(dá)式本身,其他地方都不可用。這種寫法的用處有兩個,一是可以在函數(shù)體內(nèi)部調(diào)用自身,二是方便除錯(除錯工具顯示函數(shù)調(diào)用棧時,將顯示函數(shù)名,而不再顯示這里是一個匿名函數(shù))。
(3)下面的形式聲明函數(shù)也非常常見。
需要注意的是,函數(shù)的表達(dá)式需要在語句的結(jié)尾加上分號,表示語句結(jié)束。而函數(shù)的聲明在結(jié)尾的大括號后面不用加分號。
五、函數(shù)聲明和函數(shù)表達(dá)式的區(qū)別 5.1 說明(1)如果不聲明函數(shù)名稱,他肯定是表達(dá)式。
(2)若聲明了函數(shù)名稱,可通過上下文來區(qū)分的,如果function test(){}是作為賦值表達(dá)式的一部分的話,那它就是一個函數(shù)表達(dá)式,如果function test(){}被包含在一個函數(shù)體內(nèi),或者位于程序的最頂部的話,那它就是一個函數(shù)聲明。
(4)函數(shù)聲明會在任何表達(dá)式被解析和求值之前先被解析和求值,即使你的聲明在代碼的最后一行,它也會在同作用域內(nèi)第一個表達(dá)式之前被解析/求值。
函數(shù)fn是在alert之后聲明的,但是在alert執(zhí)行的時候,fn已經(jīng)有定義了。
(5)函數(shù)聲明在條件語句內(nèi)雖然可以用,但是沒有被標(biāo)準(zhǔn)化,也就是說不同的環(huán)境可能有不同的執(zhí)行結(jié)果,所以這樣情況下,最好使用函數(shù)表達(dá)式。
六、Function 構(gòu)造函數(shù) 6.1 示例(1)下面代碼中,F(xiàn)unction構(gòu)造函數(shù)接受三個參數(shù),除了最后一個參數(shù)是sum函數(shù)的“函數(shù)體”,其他參數(shù)都是add函數(shù)的參數(shù)。
(2)可以傳遞任意數(shù)量的參數(shù)給Function構(gòu)造函數(shù),只有最后一個參數(shù)會被當(dāng)做函數(shù)體,如果只有一個參數(shù),該參數(shù)就是函數(shù)體。
6.2 注意(1)Function構(gòu)造函數(shù)無法指定函數(shù)名稱,它創(chuàng)建的是一個匿名函數(shù)。
(2)把Function的構(gòu)造函數(shù)當(dāng)作函數(shù)一樣調(diào)用(不使用new操作符)的效果與作為Function的構(gòu)造函數(shù)調(diào)用一樣。
(3)從技術(shù)上講,這是一個函數(shù)表達(dá)式。但不推薦使用,因為這種語法會導(dǎo)致解析兩次代碼。第一次是解析常規(guī)javascript代碼,第二次解析傳入構(gòu)造函數(shù)中的字符串,影響性能。
閱讀更多
參考文章 深入理解JavaScript系列(2):揭秘命名函數(shù)表達(dá)式
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/93948.html
摘要:也就是說,所有的函數(shù)和構(gòu)造函數(shù)都是由生成,包括本身。如果只考慮構(gòu)造函數(shù)和及其關(guān)聯(lián)的原型對象,在不解決懸念的情況下,圖形是這樣的可以看到,每一個構(gòu)造函數(shù)和它關(guān)聯(lián)的原型對象構(gòu)成一個環(huán),而且每一個構(gòu)造函數(shù)的屬性無所指。 前言 JavaScript 是我接觸到的第二門編程語言,第一門是 C 語言。然后才是 C++、Java 還有其它一些什么。所以我對 JavaScript 是非常有感情的,畢...
摘要:用和包裹的內(nèi)容,稱為字符串。關(guān)系運算符用于進(jìn)行比較的運算符。強制依賴于,非強制依賴于。使用場合全局環(huán)境構(gòu)造函數(shù)對象的方法閉包閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)。所有全局對象函數(shù)以及變量均自動成為對象的成員。 1 什么是JavaScript JavaScript一種直譯式腳本語言,一種基于對象和事件驅(qū)動并具有安全性的客戶端腳本語言;也是一種廣泛應(yīng)用客戶端web開發(fā)的腳本語言。...
摘要:定義函數(shù)與調(diào)用函數(shù)定義函數(shù)時,函數(shù)體的內(nèi)容時不會被執(zhí)行。調(diào)用函數(shù)才會真正執(zhí)行這些。簡單來說,就是調(diào)用函數(shù)時使用的參數(shù)就是實參。 函數(shù) 函數(shù)的概念 函數(shù)式什么?函數(shù)是一段JavaScript中的一段代碼,它只能定義一次,但是可能被執(zhí)行或調(diào)用多次。簡單來說,函數(shù)就是一組可重用的代碼,可以在程序的任何地方調(diào)用他。 定義函數(shù)與調(diào)用函數(shù) 定義函數(shù)時,函數(shù)體的內(nèi)容時不會被執(zhí)行。定義一個函數(shù)并不會自...
摘要:第四點也要著重講下,記住構(gòu)造函數(shù)被操作,要讓正常作用最好不能在構(gòu)造函數(shù)里 4) this、new、call和apply的相關(guān)問題 講解this指針的原理是個很復(fù)雜的問題,如果我們從javascript里this的實現(xiàn)機(jī)制來說明this,很多朋友可能會越來越糊涂,因此本篇打算換一個思路從應(yīng)用的角度來講解this指針,從這個角度理解this指針更加有現(xiàn)實意義。 下面我們看看在ja...
摘要:然后將構(gòu)造函數(shù)的原型設(shè)為,便實現(xiàn)了對象繼承。首先,我們定義一個構(gòu)造函數(shù),并在其中定義一個局部變量。這里的是局部變量,其作用域仍然存在是閉包現(xiàn)象,而非對象屬性。 Javascript是動態(tài)的,弱類型的,解釋執(zhí)行的程序設(shè)計語言。 Javascript極其靈活,支持多種程序設(shè)計范式:面向?qū)ο?、指令式、函?shù)式。JavaSCript最初被用于瀏覽器腳本,現(xiàn)在已經(jīng)是所有主流瀏覽器的默認(rèn)腳本語言。瀏...
摘要:函數(shù)函數(shù)是什么函數(shù)是這樣的一段代碼它只定義一次但可能被執(zhí)行或調(diào)用多次簡單來說函數(shù)就是一組可重用的代碼可以在程序的任何地方調(diào)用定義函數(shù)函數(shù)聲明方式定義函數(shù)時函數(shù)體的內(nèi)容是不會被執(zhí)行的這是一個函數(shù)字面量直接量方式這是一個函數(shù)調(diào)用函數(shù)定義一個函數(shù) 函數(shù) 函數(shù)是什么 函數(shù)是這樣的一段JavaScript代碼 它只定義一次 但可能被執(zhí)行或調(diào)用多次簡單來說 函數(shù)就是一組可重用的代碼 可以在程序的任...
閱讀 2001·2021-11-19 09:40
閱讀 1960·2021-09-28 09:36
閱讀 2291·2021-09-22 10:02
閱讀 2733·2019-08-30 14:00
閱讀 1962·2019-08-29 15:31
閱讀 2904·2019-08-29 15:11
閱讀 2915·2019-08-29 13:04
閱讀 1088·2019-08-27 10:55