2

異なるファイルに存在するソースコード間で関数と変数の巻き上げを行う方法はありますか?つまり、

//Inside firstfile.js
foo === "bar" //should return true

//Inside secondfile.js
function bar() {
    this.foo = "bar";
}

ほとんどのjavascriptエンジンで別々に、順番に解析および実行されるさまざまなファイルがあるため、これは不可能だと思いますが、確かなことはわかりません。

異なるファイルの解析は実際には言語の一部ではないため、これがECMAの仕様に含まれているかどうかはわかりません。

4

3 に答える 3

5

私は当初、これは実際に見えるよりも興味深い質問だと思っていました。私が考えた質問への答えは、各<script>要素が個別の を表し、個別Programの各プログラムが解析され、(重要なことに) 次のプログラムに何かが起こる前に実行されるため、巻き上げの効果は単一のプログラム内でのみ見られるということです。

たとえば、1 つのスクリプト内では次のようになります。

<script type="text/javasscript">
    alert(typeof foo);
    function foo() {}
</script>

...関数宣言が巻き上げられているため、「関数」を警告しますが、2行を別々<script>の要素に分割すると、次のようになります。

<script type="text/javasscript">
    alert(typeof foo);
</script>
<script type="text/javasscript">
    function foo() {}
</script>

... 2 番目のスクリプトが解析される前に最初のスクリプトが実行されるため、"undefined" というアラートが表示されます。

于 2010-11-10T13:42:54.093 に答える
1

個別にロードされた Javascript ソースはすべて、グローバル コンテキストに影響を与える可能性があります。したがって

window.foo = "bar";

1 つのソース ファイルで、別のソース (後で読み込まれる) がチェックできるようになります。

if (window.foo === "bar") {
  // do something
}

これが機能しないと、一般的な Javascript フレームワークのようなものを作成できません。

「this」キーワードは関数内でのみ意味があり、その値は関数のソース ファイルとは何の関係もありません (少なくとも、直接的な意味では何もありません)。

編集— ここで興味深いのは、(質問でこの用語を使用するために) ブロック内の他のコードが評価される前に関数宣言を「持ち上げる」Javascript インタープリターの動作だと思います。これも、ブラウザーがそれらをロードするときにスクリプトごとに行われます。したがって、スクリプト ブロック内の関数宣言は、各ブロック内の他のコードの前に解釈されますが、次のタグが読み込まれて評価される前に、1 つの<script>タグが完全に評価されます。<script>

LabJS や Enhanced.js のようなものを使用してスクリプトをロードしている場合、事態はさらに複雑になりますが、サーバーで明示的に結合しない限り、何らかの形でスクリプトを「ブレンド」することに依存できるコンテキストはわかりません。

于 2010-11-10T13:27:37.070 に答える
1

ブラウザーが遭遇するすべてのスクリプト タグが解析され、すぐに実行されます。これは、DOM に何かを出力するためにブラウザが必要になる可能性がある document.write API によるものです。これは、この状況では #script1 が #script2 の前に終了する必要があることを意味します。

<script id="script1"></script>
<script id="script2"></script>

ASYNC および DEFER 属性を使用した場合の動作を確認する必要がある場合があります。これらは Webkit でサポートされています。

于 2010-11-10T14:18:57.397 に答える