摘要:函數(shù)表達(dá)式的分類匿名函數(shù)表達(dá)式具名函數(shù)表達(dá)式自調(diào)用函數(shù)表達(dá)式函數(shù)表達(dá)式的用法使用來接偶函數(shù)名和函數(shù)體的耦合狀態(tài)。修改函數(shù)表達(dá)式代碼如下閉包我們知道,函數(shù)表達(dá)式是將匿名函數(shù)賦值給一個(gè)變量,作為變量的值,所以,匿名函數(shù)也可以作為的返回值。
這篇文章要介紹的內(nèi)容是函數(shù)表達(dá),因?yàn)槲覀€(gè)人比較喜歡使用函數(shù)表達(dá)式定義函數(shù),所以就對它做了一些研究和整理。其實(shí),說到函數(shù)表達(dá)式,就不得不說到定義函數(shù)的另一種方式——函數(shù)聲明,它們雖然相似,但是又有一些區(qū)別,那么它們的區(qū)別是什么呢,這個(gè)問題會(huì)在本文中多帶帶說明,下面進(jìn)入正文。
函數(shù)聲明常見結(jié)構(gòu)如下:
function functionName(arg0, arg1,[...]) { // 函數(shù)體 }
由一個(gè)關(guān)鍵字 function 開頭,后面緊跟函數(shù)名,然后是函數(shù)的參數(shù)(如:(arg0, arg1,[...])),最后是函數(shù)體(如:‘{ // 函數(shù)體}’)
在JavaScript中,函數(shù)聲明有一個(gè)特性是函數(shù)聲明的提升,也就是說在代碼執(zhí)行前會(huì)先讀取函數(shù)聲明,因此,我們把函數(shù)聲明放在調(diào)用它的語句的前后皆可。
函數(shù)表達(dá)式常見結(jié)構(gòu)如下:
var functionName = function(arg0, arg1,[...]) { // 函數(shù)體 }
這種創(chuàng)建一個(gè)匿名函數(shù),然后將它賦值給變量functionName的表達(dá)式形式,就叫做函數(shù)表達(dá)式。
函數(shù)表達(dá)式的分類1.匿名函數(shù)表達(dá)式
var func = function() { console.log("I am an anonymous function expression.") }
2.具名函數(shù)表達(dá)式
var func = function functionname() { console.log("I am a named function expression.") }
3.自調(diào)用函數(shù)表達(dá)式
(function() { console.log("I am a self-call function expression.") })()函數(shù)表達(dá)式的用法
1.使用 arguments.callee 來接偶函數(shù)名和函數(shù)體的耦合狀態(tài)。
function fic(n) { return n <=1 ? 1 : n * arguments.callee(n-1) } function fic2(n) { return n <= 1 ? 1 : n * fic(n-1) } function fic3() { return 0 } fic(5) // 120 fic2(5) // 120 var fic4 = fic var fic5 = fic2 fic = fic3 fic2 = fic3 fic(5) // 0 fic2(5) // 0 fic4(5) // 120 fic5(5) // 0
但是使用 arguments.callee 在嚴(yán)格模式下存在著問題。因此,我們會(huì)使用命名函數(shù)表達(dá)式來解決這個(gè)問題。
修改fic函數(shù)表達(dá)式代碼如下:
fic = (function f(n) { return n <= 1 ? 1 : n * f(n-1) })
閉包
我們知道,函數(shù)表達(dá)式是將匿名函數(shù)賦值給一個(gè)變量,作為變量的值,所以,匿名函數(shù)也可以作為return的返回值。
這和閉包的使用是不是很相似。關(guān)于閉包的知識點(diǎn)可以參考這篇文章https://github.com/lvzhenbang/article/blob/master/js/closure.md
函數(shù)表達(dá)式 VS 函數(shù)聲明建議先看一下Function Declarations vs. Function Expressions這一篇文章。
這篇文章開始先引用了幾個(gè)示例來說明,使用函數(shù)表達(dá)式和函數(shù)聲明的區(qū)別。
函數(shù)聲明有一個(gè)規(guī)則我們應(yīng)該比較清楚就是函數(shù)聲明的提升。聲明的函數(shù)不管在我們調(diào)用函數(shù)語句之前,還是之后,只要函數(shù)聲明存在,調(diào)用函數(shù)就可以執(zhí)行成功。
變量的賦值語句,在執(zhí)行的過程中也存在著變量聲明的提升。但是要牢記變量的提升是變量定義的提升,而不是變量賦值的提升,變量賦值還在原來的位置,另外還要記住的是變量定義的提升的同時(shí)還會(huì)給變量賦值一個(gè)初始值為undefined。
函數(shù)表達(dá)式和變量的賦值表達(dá)式基本類似,只不過函數(shù)表達(dá)式所賦的值為一個(gè)函數(shù)。
另外,需要弄明白的一點(diǎn)是JavaScript這門面向?qū)ο笳Z言沒有重載(擁有相同函數(shù)名,但函數(shù)的參數(shù)不同)這個(gè)概念,但是如果后寫的代碼和前面寫的代碼定義重復(fù),后面的代碼將會(huì)覆蓋前面代碼。
后續(xù)可能還會(huì)繼續(xù)修改,也歡迎各位批評指正。有問題或者有其他想法的可以在我的GitHub上pr。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/107701.html
摘要:英文原文中本來是,而翻譯成第一類公民其實(shí)就是一種比喻。所以,通過上述的結(jié)果,我們發(fā)現(xiàn)在中不管我們是用構(gòu)造函數(shù)創(chuàng)建的對象還是用本身提供的數(shù)據(jù)類型創(chuàng)建的對象都源自于。使用可以解除函數(shù)體內(nèi)代碼和函數(shù)名的耦合狀態(tài)。 作為一個(gè)Jser,不光要會(huì)用js,還要明白它的運(yùn)行原理,不然就會(huì)一直停留在表面。 函數(shù)在JavaScript中被稱作第一等公民,這個(gè)第一等公民是什么鬼?看看知乎上是怎么回答的。就像...
摘要:責(zé)編現(xiàn)代化的方式開發(fā)一個(gè)圖片上傳工具前端掘金對于圖片上傳,大家一定不陌生。之深入事件機(jī)制前端掘金事件綁定的方式原生的事件綁定方式有幾種想必有很多朋友說種目前,在本人目前的研究中,只有兩種半兩種半還有半種的且聽我道來。 Ajax 與數(shù)據(jù)傳輸 - 前端 - 掘金背景 在沒有ajax之前,前端與后臺傳數(shù)據(jù)都是靠表單傳輸,使用表單的方法傳輸數(shù)據(jù)有一個(gè)比較大的問題就是每次提交數(shù)據(jù)都會(huì)刷新頁面,用...
摘要:今天同學(xué)去面試,做了兩道面試題全部做錯(cuò)了,發(fā)過來給道典型的面試題前端掘金在界中,開發(fā)人員的需求量一直居高不下。 排序算法 -- JavaScript 標(biāo)準(zhǔn)參考教程(alpha) - 前端 - 掘金來自《JavaScript 標(biāo)準(zhǔn)參考教程(alpha)》,by 阮一峰 目錄 冒泡排序 簡介 算法實(shí)現(xiàn) 選擇排序 簡介 算法實(shí)現(xiàn) ... 圖例詳解那道 setTimeout 與循環(huán)閉包的經(jīng)典面...
摘要:將指定的數(shù)字索引值轉(zhuǎn)換成字符串索引值變成,然后將其作為屬性名來用。返回一個(gè)由刪除元素組成的數(shù)組。該方法返回的數(shù)組元素是調(diào)用的數(shù)組的一個(gè)子集。使用的函數(shù)有四個(gè)參數(shù)初始值積累值數(shù)組元素元素索引數(shù)組本身。 前言 很多人在學(xué)習(xí)原生JS的過程中會(huì)遇到一些疑惑,比如在學(xué)習(xí)array時(shí),就很容易搞不清哪些方法會(huì)改變原來數(shù)組,哪些方法不會(huì)改變原來數(shù)組?再比如很多人會(huì)使用new Date()獲取時(shí)間,卻...
摘要:插件開發(fā)前端掘金作者原文地址譯者插件是為應(yīng)用添加全局功能的一種強(qiáng)大而且簡單的方式。提供了與使用掌控異步前端掘金教你使用在行代碼內(nèi)優(yōu)雅的實(shí)現(xiàn)文件分片斷點(diǎn)續(xù)傳。 Vue.js 插件開發(fā) - 前端 - 掘金作者:Joshua Bemenderfer原文地址: creating-custom-plugins譯者:jeneser Vue.js插件是為應(yīng)用添加全局功能的一種強(qiáng)大而且簡單的方式。插....
閱讀 2302·2021-10-09 09:41
閱讀 1756·2019-08-30 15:53
閱讀 1002·2019-08-30 15:52
閱讀 3453·2019-08-30 11:26
閱讀 780·2019-08-29 16:09
閱讀 3438·2019-08-29 13:25
閱讀 2275·2019-08-26 16:45
閱讀 1943·2019-08-26 11:51