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

首頁 > 編程 > JavaScript > 正文

JavaScript學習筆記(三):JavaScript也有入口Main函數

2019-11-20 11:34:49
字體:
來源:轉載
供稿:網友

在C和Java中,都有一個程序的入口函數或方法,即main函數或main方法。而在JavaScript中,程序是從JS源文件的頭部開始運行的。但是某種意義上,我們仍然可以虛構出一個main函數來作為程序的起點,這樣一來不僅可以跟其他語言統一了,而且說不定你會對JS有更深的理解。

1. 實際的入口

當把一個JavaScript文件交給JS引擎執行時,JS引擎就是從上到下逐條執行每條語句的,直到執行完所有代碼。

2. 作用域鏈、全局作用域和全局對象

我們知道,JS中的每個函數在執行時都會產生一個新的作用域。具體來說,在執行流程進入函數時會建立一個新的作用域,在函數執行完成退出時會銷毀這個作用域。函數的形參、局部變量都會綁定到這個作用域里,當函數調用完成作用域銷毀時,它們隨之被銷毀。當然在特殊情況下,如果函數返回時作用域中的某些變量仍然被引用,那么作用域以及這些被引用的變量就不會被銷毀,從而形成所謂的閉包。

另一方面,我們知道函數是可以嵌套的,因而作用域也是可以嵌套的。函數在定義的時候,JS引擎會給每個函數設置一個稱為[[scope]]內置屬性,它指向外部函數的詞法作用域。通過這種方式,多個作用域形成了鏈式結構,稱為作用域鏈。通常情況下,在任意時刻只存在一條作用域鏈,即從正在執行的函數的作用域開始,層層上溯,直到最外層的全局作用域。

[注]:作用域鏈上的函數就是JS源碼里的層層嵌套的函數,跟函數執行時的順序或函數調用棧無關,這也是詞法作用域這個稱呼的由來。

全局作用域是一個特殊的作用域,它不是一個函數作用域,但它是所有函數作用域的外層作用域,也是所有作用域鏈的終點。因此只要程序沒有退出,全局作用域總是存在的,全局作用域內的變量也是一直有效的。

[函數3的作用域]-->[函數2的作用域]-->[函數3的作用域]-->[全局作用域]

另外,對應于全局作用域,還有一個全局對象。在瀏覽器中,全局對象就是window對象。全局對象是個特殊的對象:

在全局作用域中定義的變量,都會綁定到全局對象。

在任意作用域中定義的變量,如果定義時沒有用 var 關鍵字,都會綁定到全局對象。

在全局作用域中, this 指向全局對象。

從上面列舉的這些特性可以看出,如果把全局作用域當成一個對象的話,那么實際上它就是全局對象。另外,這也解釋了在全局作用域中,下面的四條語句為什么是等價的:

var a = 1;a = 1;window.a = 1;this.a = 1;

3. 虛構的main函數

既然都是作用域,為什么要有一個特殊的全局作用域呢?我們總是喜歡簡單化、一致性,而盡量避免復雜化、特殊性。所以很自然地,我們會想能否讓全局作用域看起來跟函數作用域沒什么區別?答案是肯定的。我們可以做這樣的構想:

 我們想象,在JS引擎執行源文件時,會將文件中的代碼包裝到一個叫做main的函數中。然后把這個main函數作為程序的入口。
也就是說,假設一個JS文件中有這樣的代碼:

var a = 1;var b = 2;function add(x, y) {  var z = x + y;  return z;}console.log(add(a, b));

JS引擎在程序開始執行前會把它包裝成一個main函數:

// 虛構的main函數function main() {  var a = 1;  var b = 2;  function add(x, y) {    var z = x + y;    return z;  }  console.log(add(a, b));}

然后,調用這個main函數:

main._current_scope_ = window; // 將全局作用域(對象)設為windowmain.call(window) // 將this指向window

4. 意義何在?

(1) JS也有了入口函數main,跟其他語言一致了。

(2) 省去了全局作用域的概念,或者說全局作用域也成了函數作用域。

(3) 通過上面對main函數的調用過程,可以明白全局作用域中的那些特殊性質的由來。

(4) 最后一點,將所有JS源碼當成一個函數,是為了后面講事件隊列、事件循環做鋪墊。

以上就是小編給大家介紹的JavaScript學習筆記(三):JavaScript也有入口Main函數,希望大家喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 邢台县| 奇台县| 革吉县| 保山市| 巴青县| 马山县| 万宁市| 桓仁| 台州市| 松阳县| 福海县| 临漳县| 新宾| 武隆县| 随州市| 科技| 墨玉县| 县级市| 融水| 新余市| 穆棱市| 朝阳县| 陆河县| 寿宁县| 博白县| 临颍县| 新绛县| 青岛市| 石门县| 长白| 海南省| 聂荣县| 凌云县| 遂川县| 仪陇县| 察隅县| 瓮安县| 海兴县| 太和县| 类乌齐县| 和林格尔县|