2015-01-03 7 views
11

私はここにソースコードを閲覧しました:http://js-dos.com/games/doom2.exe.htmlといくつかのことに気づいた:モジュールの機能は、それが後で別のインラインでvarで再び宣言され この評価の目的は何ですか?

  • インラインスクリプトタグで定義されて

    if (typeof Module === 'undefined') 
    { 
        Module = eval('(function() {try { return Module || {} } catch(e) { return {} }})()'); 
    } 
    
    • をタグでは、今回はモジュールが存在するかどうかをチェックします。

    私の質問:それだけで再びモジュールを返すように頑張ります場合は自己呼び出し機能をモジュールの宣言のポイントは何ですか?それが存在しないことはすでに証明されていませんか?なぜモジュールを{}と明示的に宣言していないのですか?

  • +4

    このコードはemscriptenプロジェクトのgithubにあります。このコミットで追加されました:https://github.com/kripken/emscripten/commit/22d510338239c1cf33136392c77a9b3d7d2ce2bc彼らは明示的な宣言からevalステートメントに移行しましたが、コミットmsg isn;理由を明らかにしてください!私はタグとしてemscriptenを追加しました。その後、プロジェクトの誰か、またはそれをよく知っている人は、それを発見して助けてくれるかもしれません。 – sifriday

    答えて

    5

    typeof Module Moduleがローカル変数の場合は、undefinedが含まれることがあります。このコードは、いくつかのケースをサポートするためのものです。モジュールはローカルまたはグローバルであり、定義済みまたは未定義です。グローバルスコープの汚染を避けたいので、定義されていない場合はModule = ...を実行するだけではありません。

    まず、通常のケースは、グローバルスコープ内のemscripten生成コードです。この場合、Moduleは定義されていても定義されていなくても構いませんが、ローカルの場合もありますがundefinedなので、両方を処理する必要があります。

    第2に、emscriptenコードは、ammo.jsを使用するゲームのような単なるモジュールにすぎません。その場合、使用法は

    です。この場合、Moduleはこの場合、ローカル関数であり、既に私たちのために定義されているパラメータとして与えられています。

    var Moduleを宣言することは、モジュールがローカル変数であることを意味するためです。だから我々はevalが必要です。 evalでは、try-catchが必要なので、値を返す関数が必要です。 try-catchはModuleを使い、Moduleがローカルでない場合(たとえそれがundefinedを含んでいるかどうかにかかわらず)、これはまさに私たちが望むものです。

    このコードは単純化することもできます。

    +2

    あなたはそれを言及していないので、記録のために:** Alonはその行の作者です** –

    +2

    githubとSOのコンビネーションはこのような質問をして参加できるコミットしてから作者に渡し、誰がその質問に答えることができます。 – sifriday

    関連する問題