Подъем между разными файлами - PullRequest
1 голос
/ 10 ноября 2010

Есть ли способ выполнять функции и перемещать переменные между исходным кодом, представленным в разных файлах? То есть что-то вроде

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

и

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

Я полагаю, что это невозможно, так как различные файлы анализируются и выполняются по отдельности и по порядку в большинстве движков javascript, но я точно не знаю.

Я не знаю, даже если это в спецификации от ECMA, так как разбор различных файлов на самом деле не является частью языка.

Ответы [ 3 ]

3 голосов
/ 10 ноября 2010

Первоначально я думал, что это более интересный вопрос, чем кажется на самом деле. Ответ на вопрос, который я считал таким, заключается в том, что каждый элемент <script> представляет отдельную Program, каждая отдельная Программа анализируется и (что крайне важно) выполняется до того, как что-либо случится со следующей Программой, поэтому последствия подъема можно увидеть только в рамках одной Программы.

Например, внутри одного скрипта:

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

... оповещает «функцию», потому что объявление функции поднято, но разделение двух строк на отдельные элементы <script> меняет это:

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

... предупреждает «undefined», поскольку первый сценарий выполняется до того, как второй сценарий будет даже проанализирован.

1 голос
/ 10 ноября 2010

Все теги сценария, с которыми сталкивается браузер, анализируются и выполняются немедленно. Это из-за API document.write, который может потребовать от браузера выводить что-то в DOM. Это означает, что в этой ситуации # script1 должен завершиться до # script2.

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

Вы можете проверить поведение при использовании атрибутов ASYNC и DEFER. Они поддерживаются в Webkit.

1 голос
/ 10 ноября 2010

Отдельно загруженные источники Javascript могут влиять на глобальный контекст. Таким образом

window.foo = "bar";

в одном исходном файле позволит другому источнику (загруженному впоследствии) проверить:

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

Это должно сработать, иначе было бы невозможно создать что-то похожее на все популярные фреймворки Javascript.

Ключевое слово "this" имеет смысл только внутри функции, и его значение не имеет ничего общего с исходным файлом, из которого была получена функция (по крайней мере, в прямом смысле этого слова).

изменить & mdash; Я предполагаю, что интересная вещь здесь - это поведение интерпретатора Javascript, которое (используя термин в вопросе) «поднимает» объявления функции перед другим кодом в вычисляемом блоке. Это также делается по сценарию, когда браузер загружает их. Таким образом, объявления функций в блоке сценария интерпретируются перед другим кодом в каждом блоке , но один тег <script> будет полностью оценен до загрузки и оценки следующего тега <script>.

Ситуация усложняется, если для загрузки сценариев вы используете что-то вроде LabJS или extension.js, но я не знаю ни одного контекста, в котором вы могли бы полагаться на сценарии, «смешивающиеся» как-то , если Вы явно объединяете их на сервере.

...