首頁 >web前端 >前端問答 >javascript有main函數嗎

javascript有main函數嗎

WBOY
WBOY原創
2022-04-06 12:03:594068瀏覽

javascript中沒有main函數。 main函數常用於Java與C語言中,又稱為主函數,是要求有回傳值的,回傳0代表程式正常執行成功,回傳非0值代表程式異常結束;而在JavaScript中不存在該函數。

javascript有main函數嗎

本教學操作環境:windows10系統、javascript1.8.5版、Dell G3電腦。

javascript有main函數嗎

javascript沒有main函數

#簡介

##main函數,又稱主函數,作為絕大部分C程式唯一的入口,是要求有回傳值的,該回傳值會傳回(如作業系統)來表示該程式的執行狀況。回傳0代表程式正常執行成功,回傳非0值代表程式異常結束,因此回傳值需要是int整數型,所以有了int main()的規格。

如果使用void main(),即聲明主函數沒有回傳值,程式雖能編譯、運行成功,卻不利於程式的啟動者判斷其狀態,這對於有很多C程式構成的大型項目來說是可能是致命的。

尤其從C99標準(1999年制定的官方C語言標準第二版)開始必須使用int main(),如果沒有加return 0;語言,C99要求編譯器自動添加(自己寫上是一個好習慣)。只宣告main()的話,系統預設為int main()。 void main()無論何時都不應該使用,因為主函數必須有回傳值來表示程式的運作狀態(在程式碼中不使用void main()是一個良好的習慣)。

定義

在最新的C99標準中,只有以下兩種定義方式是正確的:

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

參數

void:不接受任何參數;

argc:代表程式所執行環境傳遞給程式的參數數量;

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

傳回值

傳回值會用作隱含呼叫exit()的參數,值0和EXIT_SUCCESS指示成功終止,值非0和EXIT_FAILURE指示不成功終止。

範例如下:在JavaScript中虛構一個main函數

#在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; // 将全局作用域(对象)设为window
main.call(window) // 将this指向window

4. 意义何在?

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

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

(3) 通过上面对main函数的调用过程,可以明白全局作用域中的那些特殊性质的由来。

(4) 最后一点,将所有JS源码当成一个函数,是为了后面讲事件队列、事件循环做铺垫。

相关推荐:javascript学习教程

以上是javascript有main函數嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn