国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript中函數(shù)表達(dá)式和函數(shù)聲明及函數(shù)聲明與函數(shù)表達(dá)式的不同

2019-11-20 11:16:19
字體:
供稿:網(wǎng)友

函數(shù)表達(dá)式和函數(shù)聲明

在ECMAScript中,創(chuàng)建函數(shù)的最常用的兩個方法是函數(shù)表達(dá)式和函數(shù)聲明,兩者期間的區(qū)別是有點暈,因為ECMA規(guī)范只明確了一點:函數(shù)聲明必須帶有標(biāo)示符(Identifier)(就是大家常說的函數(shù)名稱),而函數(shù)表達(dá)式則可以省略這個標(biāo)示符:

  函數(shù)聲明:

  function 函數(shù)名稱 (參數(shù):可選){ 函數(shù)體 }

  函數(shù)表達(dá)式:

  function 函數(shù)名稱(可選)(參數(shù):可選){ 函數(shù)體 }

所以,可以看出,如果不聲明函數(shù)名稱,它肯定是表達(dá)式,可如果聲明了函數(shù)名稱的話,如何判斷是函數(shù)聲明還是函數(shù)表達(dá)式呢?ECMAScript是通過上下文來區(qū)分的,如果function foo(){}是作為賦值表達(dá)式的一部分的話,那它就是一個函數(shù)表達(dá)式,如果function foo(){}被包含在一個函數(shù)體內(nèi),或者位于程序的最頂部的話,那它就是一個函數(shù)聲明。

 function foo(){} // 聲明,因為它是程序的一部分 var bar = function foo(){}; // 表達(dá)式,因為它是賦值表達(dá)式的一部分 new function bar(){}; // 表達(dá)式,因為它是new表達(dá)式 (function(){  function bar(){} // 聲明,因為它是函數(shù)體的一部分 })();

還有一種函數(shù)表達(dá)式不太常見,就是被括號括住的(function foo(){}),他是表達(dá)式的原因是因為括號 ()是一個分組操作符,它的內(nèi)部只能包含表達(dá)式,我們來看幾個例子:

  function foo(){} // 函數(shù)聲明
  (function foo(){}); // 函數(shù)表達(dá)式:包含在分組操作符內(nèi)

命名函數(shù)表達(dá)式

提到命名函數(shù)表達(dá)式,理所當(dāng)然,就是它得有名字,前面的例子var bar = function foo(){};就是一個有效的命名函數(shù)表達(dá)式,但有一點需要記住:這個名字只在新定義的函數(shù)作用域內(nèi)有效,因為規(guī)范規(guī)定了標(biāo)示符不能在外圍的作用域內(nèi)有效:

 var f = function foo(){  return typeof foo; // foo是在內(nèi)部作用域內(nèi)有效 }; // foo在外部用于是不可見的 console.log(typeof foo); // "undefined" console.log(f()); // "function"var f = function foo(){return foo; // foo是在內(nèi)部作用域內(nèi)有效};// foo在外部用于是不可見的console.log(typeof foo); // "undefined"console.log( f()==f); // "function"console.log(f.name);//foo

既然,這么要求,那命名函數(shù)表達(dá)式到底有啥用啊?為啥要取名?

正如我們開頭所說:給它一個名字就是可以讓調(diào)試過程更方便,因為在調(diào)試的時候,如果在調(diào)用棧中的每個項都有自己的名字來描述,那么調(diào)試過程就太爽了,感受不一樣嘛。

ps:JS中函數(shù)聲明與函數(shù)表達(dá)式的不同

Js中的函數(shù)聲明是指下面的形式:

function functionName(){ } 

這樣的方式來聲明一個函數(shù),而函數(shù)表達(dá)式則是類似表達(dá)式那樣來聲明一個函數(shù),如:

     var functionName = function(){ }

可能很多朋友在看到這兩一種寫法時會產(chǎn)生疑惑,這兩種寫法差不多,在應(yīng)用中貌似也都是可行的,那他們有什么差別呢?

 事實上,js的解析器對函數(shù)聲明與函數(shù)表達(dá)式并不是一視同仁地對待的。對于函數(shù)聲明,js解析器會優(yōu)先讀取,確保在所有代碼執(zhí)行之前聲明已經(jīng)被解析,而函數(shù)表達(dá)式,如同定義其它基本類型的變量一樣,只在執(zhí)行到某一句時也會對其進(jìn)行解析,所以在實際中,它們還是會有差異的,具體表現(xiàn)在,當(dāng)使用函數(shù)聲明的形式來定義函數(shù)時,可將調(diào)用語句寫在函數(shù)聲明之前,而后者,這樣做的話會報錯。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 武乡县| 甘孜| 类乌齐县| 哈巴河县| 贵溪市| 周至县| 临澧县| 五台县| 余干县| 南安市| 光山县| 辽宁省| 定远县| 石城县| 张家口市| 余江县| 阿拉善左旗| 连平县| 郎溪县| 定远县| 彰化市| 双峰县| 海南省| 独山县| 冀州市| 兰州市| 盘锦市| 鄂托克旗| 溧水县| 镇雄县| 石屏县| 伊吾县| 永寿县| 绥宁县| 胶州市| 搜索| 农安县| 静乐县| 彰化县| 丰台区| 佛坪县|