溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

javascript中有沒有main函數(shù)

發(fā)布時間:2022-04-06 13:33:23 來源:億速云 閱讀:339 作者:iii 欄目:web開發(fā)

這篇文章主要講解了“javascript中有沒有main函數(shù)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“javascript中有沒有main函數(shù)”吧!

javascript中沒有main函數(shù)。main函數(shù)常用于Java與C語言中,又稱主函數(shù),是要求有返回值的,返回0代表程序正常執(zhí)行成功,返回非0值代表程序異常結(jié)束;而在JavaScript中不存在該函數(shù)。

本教程操作環(huán)境:windows10系統(tǒng)、javascript1.8.5版、Dell G3電腦。

javascript有main函數(shù)嗎

javascript沒有main函數(shù)

簡介

main函數(shù),又稱主函數(shù),作為絕大部分C程序唯一的入口,是要求有返回值的,該返回值返回給(如操作系統(tǒng))來表明該程序的執(zhí)行狀況。返回0代表程序正常執(zhí)行成功,返回非0值代表程序異常結(jié)束,因此返回值需要是int整型,于是有了int main()的規(guī)范。

如果使用void main(),即聲明主函數(shù)沒有返回值,程序雖能編譯、運行成功,卻不利于程序的激活者判斷其狀態(tài),這對于有很多C程序構(gòu)成的大型項目來說是可能是致命的。

尤其從C99標(biāo)準(zhǔn)(1999年制定的官方C語言標(biāo)準(zhǔn)第二版)開始必須使用int main(),如果沒有加return 0;語言,C99要求編譯器自動添加(自己寫上是個好習(xí)慣)。只聲明main()的話,系統(tǒng)默認為int main()。void main()無論何時都不應(yīng)該使用,因為主函數(shù)必須有返回值表明程序的運行狀態(tài)(在代碼中不使用void main()是一個良好的習(xí)慣)。

定義

在最新的C99標(biāo)準(zhǔn)中,只有以下兩種定義方式是正確的:

int main(void)
int main(int argc, char *argv[]) // char *argv[]可以寫成char **argv

參數(shù)

void:不接受任何參數(shù);

argc:代表程序所運行環(huán)境傳遞給程序的參數(shù)數(shù)量;

argv:指向argc+1個指針的數(shù)組的首元素的指針。數(shù)組末元素為空指針,而若前面有元素,則它們指向表示從宿主環(huán)境傳遞給程序的參數(shù)的字符串。若argv[0]不是空指針(或argc>0),則它指向表示程序名的字符串。若程序名從宿主環(huán)境不可用則該字符串為空。

返回值

返回值會用作隱式調(diào)用exit()的參數(shù),值0和EXIT_SUCCESS指示成功終止,值非0和EXIT_FAILURE指示不成功終止。

示例如下:在JavaScript中虛構(gòu)一個main函數(shù)

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

1. 實際的入口

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

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

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

另一方面,我們知道函數(shù)是可以嵌套的,因而作用域也是可以嵌套的。函數(shù)在定義的時候,JS引擎會給每個函數(shù)設(shè)置一個稱為[[scope]]內(nèi)置屬性,它指向外部函數(shù)的詞法作用域。通過這種方式,多個作用域形成了鏈?zhǔn)浇Y(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 指向全局對象。

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

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源碼當(dāng)成一個函數(shù),是為了后面講事件隊列、事件循環(huán)做鋪墊。

感謝各位的閱讀,以上就是“javascript中有沒有main函數(shù)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對javascript中有沒有main函數(shù)這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI