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

來源:互聯網
上載者:User

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

在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函數,希望大家喜歡。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.