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