欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript學(xué)習(xí)筆記(三):JavaScript也有入口Main函數(shù)

 更新時間:2015年09月12日 09:29:34   作者:manxisuo  
大家都知道在c和java中,有main函數(shù)貨main方法作為一個程序的入口函數(shù)或方法。在JS中從js源文件的頭部開始運行的,我們?nèi)匀豢梢蕴摌?gòu)出一個main函數(shù)來作為程序的起點,這樣一來不僅可以跟其他語言統(tǒng)一了,而且說不定你會對JS有更深的理解。感興趣的小伙跟著小編一起學(xué)習(xí)吧

在C和Java中,都有一個程序的入口函數(shù)或方法,即main函數(shù)或main方法。而在JavaScript中,程序是從JS源文件的頭部開始運行的。但是某種意義上,我們?nèi)匀豢梢蕴摌?gòu)出一個main函數(shù)來作為程序的起點,這樣一來不僅可以跟其他語言統(tǒng)一了,而且說不定你會對JS有更深的理解。

1. 實際的入口

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

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

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

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

[注]:作用域鏈上的函數(shù)就是JS源碼里的層層嵌套的函數(shù),跟函數(shù)執(zhí)行時的順序或函數(shù)調(diào)用棧無關(guān),這也是詞法作用域這個稱呼的由來。

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

[函數(shù)3的作用域]-->[函數(shù)2的作用域]-->[函數(shù)3的作用域]-->[全局作用域]

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

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

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

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

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

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

3. 虛構(gòu)的main函數(shù)

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

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

var a = 1;
var b = 2;

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

JS引擎在程序開始執(zhí)行前會把它包裝成一個main函數(shù):

// 虛構(gòu)的main函數(shù)
function main() {
  var a = 1;
  var b = 2;

  function add(x, y) {
    var z = x + y;
    return z;
  }

  console.log(add(a, b));
}

然后,調(diào)用這個main函數(shù):

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

4. 意義何在?

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

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

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

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

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

相關(guān)文章

  • 微信小程序之發(fā)送短信倒計時功能

    微信小程序之發(fā)送短信倒計時功能

    這篇文章主要介紹了微信小程序之發(fā)送短信倒計時功能,需要的朋友可以參考下
    2017-08-08
  • JavaScript表單驗證實現(xiàn)過程詳解

    JavaScript表單驗證實現(xiàn)過程詳解

    表單校驗是注冊環(huán)節(jié)中必不可少的操作,表單校驗通過一定的規(guī)則來確保用戶提交數(shù)據(jù)的有效性,下面這篇文章主要給大家介紹了關(guān)于el-form表單驗證的一些實用方法,需要的朋友可以參考下
    2023-01-01
  • js技巧之十幾行的代碼實現(xiàn)vue.watch代碼

    js技巧之十幾行的代碼實現(xiàn)vue.watch代碼

    相信很多的用vue的人都知道vue雙向綁定的原理建立在,給屬性綁定了getter和setter,在屬性被改變的同時觸發(fā)視圖的再渲染。而本期也是借助這兩個內(nèi)置方法實現(xiàn)vue內(nèi)的watch
    2018-06-06
  • flexible.js實現(xiàn)移動端rem適配方案

    flexible.js實現(xiàn)移動端rem適配方案

    這篇文章主要介紹了flexible.js實現(xiàn)移動端rem適配方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • JavaScript在IE和Firefox上的差異及相互替代的實現(xiàn)方法

    JavaScript在IE和Firefox上的差異及相互替代的實現(xiàn)方法

    我們經(jīng)常在處理ie和firefox下的js總會碰到一些兼容問題,下面是些總結(jié),希望大家仔細看看研究
    2008-06-06
  • js彈出窗口之彈出層的小例子

    js彈出窗口之彈出層的小例子

    js彈出窗口之彈出層的小例子,需要的朋友可以參考一下
    2013-06-06
  • 談?wù)凧avaScript令人迷惑的==與+

    談?wù)凧avaScript令人迷惑的==與+

    這篇文章主要介紹了JavaScript中==與+的使用方法,幫助大家更好的理解和學(xué)習(xí)JavaScript,感興趣的朋友可以了解下
    2020-08-08
  • 用director.js實現(xiàn)前端路由使用實例

    用director.js實現(xiàn)前端路由使用實例

    本篇文章主要介紹了director.js實現(xiàn)前端路由,在不刷新的情況下,利用“#”號組織不同的URL路徑,并根據(jù)不同的URL路徑進行不同的方法調(diào)用。有興趣的了解一下。
    2017-01-01
  • 原生js實現(xiàn)照片墻效果

    原生js實現(xiàn)照片墻效果

    這篇文章主要介紹了原生js實現(xiàn)照片墻效果,幫助大家更好的利用js制作特效,感興趣的朋友可以了解下
    2020-10-10
  • JS變量提升及函數(shù)提升實例解析

    JS變量提升及函數(shù)提升實例解析

    這篇文章主要介紹了JS變量提升及函數(shù)提升實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09

最新評論