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

首頁 > 編程 > Java > 正文

詳解JavaScript中的函數聲明和函數表達式

2019-11-26 15:02:00
字體:
來源:轉載
供稿:網友

JavaScript 中需要創建函數的話,有兩種方法:函數聲明、函數表達式,各自寫法如下:

// 方法一:函數聲明function foo() {}// 方法二:函數表達式var foo = function () {};

另外還有一種自執行函數表達式,主要用于創建一個新的作用域,在此作用域內聲明的變量不會和其它作用域內的變量沖突或混淆,大多是以匿名函數方式存在,且立即自動執行:

(function () {  // var x = ...})();

此種自執行函數表達式歸類于以上兩種方法的第二種,也算是函數表達式。

方法一和方法二都創建了一個函數,且命名為 foo,但是二者還是有區別的。JavaScript 解釋器中存在一種變量聲明被提升(hoisting)的機制,也就是說變量(函數)的聲明會被提升到作用域的最前面,即使寫代碼的時候是寫在最后面,也還是會被提升至最前面。

例如以下代碼段:

alert(foo); // function foo() {}alert(bar); // undefinedfunction foo() {}var bar = function bar_fn() {};alert(foo); // function foo() {}alert(bar); // function bar_fn() {}

輸出結果分別是function foo() {}、undefined、function foo() {}和function bar_fn() {}。

可以看到 foo 的聲明是寫在 alert 之后,仍然可以被正確調用,因為 JavaScript 解釋器會將其提升到 alert 前面,而以函數表達式創建的函數 bar 則不享受此待遇。

那么bar 究竟有沒有被提升呢,其實用 var 聲明的變量都會被提升,只不過是被先賦值為 undefined 罷了,所以第二個 alert 彈出了 undefined。

所以,JavaScript 引擎執行以上代碼的順序可能是這樣的:

  •     創建變量 foo 和 bar,并將它們都賦值為 undefined。
  •     創建函數 foo 的函數體,并將其賦值給變量 foo。
  •     執行前面的兩個 alert。
  •     創建函數 bar_fn,并將其賦值給 bar。
  •     執行后面的兩個 alert。

注:

嚴格地說,再 JavaScript 中創建函數的話,還有另外一種方法,稱為“函數構造法”:

var foo = Function('alert("hi!");');var foo = new Function('alert("hi!");'); // 等同于上面一行

此方法以一個字符串作為參數形成函數體。但是用這種方法,執行效率方面會打折扣,且似乎無法傳遞參數,所以少用為妙。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长兴县| 湟源县| 霸州市| 崇义县| 文化| 赣榆县| 廉江市| 广德县| 邻水| 鞍山市| 象山县| 平乐县| 三穗县| 商洛市| 商丘市| 宁化县| 无锡市| 全椒县| 禄劝| 文昌市| 东乌珠穆沁旗| 商洛市| 富阳市| 五峰| 五莲县| 德钦县| 昌平区| 招远市| 营山县| 陕西省| 金阳县| 万源市| 金湖县| 双城市| 砀山县| 中超| 太仆寺旗| 赤城县| 公主岭市| 绍兴县| 浑源县|