JavaScript には main 関数がありません。 main 関数は Java や C 言語でよく使用されます。main 関数とも呼ばれ、戻り値が必要です。0 が返された場合はプログラムが正常に実行されたことを意味し、0 以外の値が返された場合はプログラムが正常に実行されなかったことを意味します。異常終了しますが、JavaScriptにはこの関数は存在しません。
このチュートリアルの動作環境: Windows 10 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。
javascript には main 関数がありません
はじめに
#main 関数および main 関数は、ほとんどの C プログラムの唯一のエントリ ポイントとして呼び出され、戻り値が必要です。戻り値は、プログラムの実行ステータスを示すために (オペレーティング システムなど) に返されます。 。 0 が返ればプログラムが正常に実行されたことを意味し、0 以外の値が返された場合はプログラムが異常終了したことを意味するため、戻り値は整数でなければならないため、 int main() の仕様になっています。
void main() を使用すると、main 関数には戻り値がないことになり、プログラムは正常にコンパイルして実行できますが、プログラムのアクティベーターがそのステータスを判断するのには役立ちません。これは、多くの C プログラムで構成される大規模なプロジェクトには適しておらず、致命的になる可能性があります。
特に C99 標準 (1999 年に策定された公式 C 言語標準の第 2 版) 以降では、int main() を使用する必要があります。return 0; 言語が追加されていない場合、C99 ではコンパイラが次のことを要求します。自動的に追加されます (自分で書きます。良い習慣です)。 main() のみが宣言されている場合、システムはデフォルトで int main() を使用します。 main 関数にはプログラムの実行状態を示す戻り値が必要なため、 void main() は決して使用しないでください (コード内で void main() を使用しないことをお勧めします)。
定義
最新の C99 標準では、次の 2 つの定義のみが正しいです:
int main(void) int main(int argc, char *argv[]) // char *argv[]可以写成char **argv
Parameters
void: Doesパラメータは受け付けません;
argc: プログラムが実行されている環境によってプログラムに渡されるパラメータの数を表します;
argv: 配列の最初の要素へのポインタargc 1 ポインタ。配列の最後の要素は null ポインターであり、以前の要素がある場合は、ホスト環境からプログラムに渡されるパラメーターを表す文字列を指します。 argv[0] が null ポインター (または argc>0) でない場合は、プログラム名を表す文字列を指します。ホスト環境からプログラム名を取得できない場合、この文字列は空になります。
戻り値
戻り値は、exit() への暗黙的な呼び出しのパラメータとして使用されます。値 0 と EXIT_SUCCESS は正常終了を示し、0 とEXIT_FAILURE は、失敗した終了を示します。
例は次のとおりです。 JavaScript で main 関数を作成します。
C と Java には、エントリ関数があります。プログラムまたはメソッド、つまり main 関数または main メソッドの場合。 JavaScriptでは、JSソースファイルの先頭からプログラムが実行されます。しかし、ある意味プログラムの起点としてmain関数を作ることはできるので、他の言語との統一だけでなく、JSへの理解も深まるかもしれません。
1. 実際の入り口
JavaScript ファイルが実行のために JS エンジンに渡されると、JS エンジンは各ステートメントを上から下に 1 つずつ実行します。すべてのコードが実行されます。
2. スコープ チェーン、グローバル スコープ、グローバル オブジェクト
JS のすべての関数は実行時に新しいスコープを生成することがわかっています。具体的には、実行プロセスが関数に入るときに新しいスコープが作成され、関数の実行が完了して終了すると、このスコープは破棄されます。関数の仮パラメータとローカル変数はこのスコープにバインドされ、関数呼び出しがスコープの破棄を完了すると、それに応じて破棄されます。もちろん、特殊なケースでは、関数が戻ったときにスコープ内のいくつかの変数がまだ参照されている場合、スコープとこれらの参照された変数は破棄されず、いわゆるクロージャが形成されます。
一方、関数は入れ子にできることがわかっているため、スコープも入れ子にすることができます。関数が定義されると、JS エンジンは各関数に対して [[scope]] という組み込み属性を設定します。これは、外部関数の字句スコープを指します。このように、複数のスコープはスコープ チェーンと呼ばれるチェーン構造を形成します。通常、常に存在するスコープ チェーンは 1 つだけです。つまり、実行されている関数のスコープから開始して、最も外側のグローバル スコープまで階層ごとに上向きにトレースされます。
[注]: スコープ チェーン上の関数は、JS ソース コード内で階層ごとにネストされた関数であり、関数の実行順序や関数呼び出しスタックとは関係がありません。名前の語彙範囲の由来。
グローバル スコープは特別なスコープであり、関数スコープではありませんが、すべての関数スコープの外側のスコープであり、すべてのスコープ チェーンの終点です。したがって、プログラムが終了しない限り、グローバル スコープは常に存在し、グローバル スコープ内の変数は常に有効です。
[機能 3 のスコープ]-->[機能 2 のスコープ]-->[機能 3 のスコープ]-->[グローバル スコープ]
また、対応するグローバル スコープには、グローバル オブジェクトがあります。ブラウザでは、グローバル オブジェクトはウィンドウ オブジェクトです。グローバル オブジェクトは特別なオブジェクトです。
グローバル スコープで定義された変数は、グローバル オブジェクトにバインドされます。
在任意作用域中定义的变量,如果定义时没有用 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 中国語 Web サイトの他の関連記事を参照してください。