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