Document.ready во внешних файлах?

Я ссылаюсь на JavaScript следующим образом на HTML-странице:

<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.js"></script>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&amp;region=GB"></script>
<script type="text/javascript" src="js/shared.js"></script>
<script type="text/javascript">
$('document').ready(function() {   
    // In-page code: call some functions in shared.js
});
</script>

Функции, определенные в shared.js, не заключены внутри $('document').ready. Итак:

  • Можно ли предположить, что функции, определенные в shared.js, доступны для кода "внутри страницы"?

  • Если я вытащил код внутри страницы в отдельный файл с именем local.js (сохраняя его в $('document').ready), можно ли предположить, что функции, определенные в shared.js, доступны?

  • Наконец, является ли факт, что я не обмениваю shared.js внутри $('document').ready проблемой? Я нахожу, что если я завершу это, его функции больше не будут доступны для кода на странице.

Причина вопроса 3 заключается в том, что я сталкиваюсь с этой проблемой: Uncaught TypeError: Свойство... не является функцией - после загрузки страницы

и интересно, связано ли это с тем, как я организовал свой код.

ОБНОВЛЕНИЕ: Спасибо за ответы. Теперь ясно, что использование $('document').ready в shared.js приведет к удалению этих функций из глобальной области. Однако я просто хочу уточнить исходный вопрос в пункте 3.

Можно ли предположить, что если я сделаю следующее:

  • внутри моего кода внутри страницы, загруженного внутри $('document').ready, вызовите функцию из shared.js
  • функция в shared.js относится к jQuery, Google Maps или элементам на моей странице.

проблем не будет?

Другими словами, можно ли предположить, что страница будет загружена к тому времени, когда вызовут функции внутри shared.js, даже если я не обертываю все в этом файле внутри $('document').ready?

Ответ 1

Можно ли предположить, что функции, определенные в shared.js, доступны для кода "внутри страницы"?

Да, до тех пор, пока эти функции вводятся в глобальную область

Если я вытащил код на странице в отдельный файл с именем local.js(сохраняя его завернутым в $('document'). готов), можно ли предположить, что функции, определенные в shared.js, доступны

Да, Пока local.js включен после shared.js И shared.js внедряет функции в глобальную область.

Наконец, это факт, что я не обмениваю shared.js внутри $('document'). Готовы проблемы? Я обнаружил, что если я его завершу, его функции больше не будут доступны для кода на странице.

Функции обтекания в document.ready выходят за пределы глобальной области.

var foo = 4; // global
$(function() {
  var bar = 5; // local
});
foo = bar; // error

Вам нужно вставлять переменные в глобальную область, это так же просто, как делать

$(function() {
  /* all your code */

  window["SomeGlobalVariable"] = someFunctionIWantGlobal;
});

Ответ 2

  • Можно с уверенностью предположить (если определения не скрыты в закрытии, к которому нельзя получить доступ).

    //shared.js
    function DoThis() {}
    function DoThat() {}   
    
  • Он по-прежнему будет работать, просто вставьте local.js после shared.js

    <script type="text/javascript" src="js/shared.js"></script>
    <script type="text/javascript" src="js/local.js"></script>
    
  • Это не сработало, потому что функции были завернуты в закрытие (тот, который будет запущен на domready), поэтому они доступны только внутри этого закрытия

    $(document).ready(function () { //this is a closure!
        function DoSg() {} 
        //DoSg is only available inside the closure
        //cannot be accessed from the outside, it defined inside
    });
    

    Кроме того, нет необходимости помещать определения функций в $(document).ready(). Часть, которая имеет значение, - это когда вы вызываете эти функции, которые должны быть внутри .ready() (ну, если это связано с материалами DOM или с чем-либо, что должно быть сделано после загрузки страницы).

Ответ 3

  • Да
  • Да
  • Может быть. Если вы обернете код в функцию, вы потеряете глобальный доступ к определенным функциям. По большей части это хорошая вещь - не загрязнение глобального пространства имен. Вы можете получить доступ к этим функциям в глобальном пространстве имен, если вместо function foo(){} вы выполняете window.foo = function(){};.

Все это не имеет значения, потому что вам либо нужен слушатель dom, либо нет - в зависимости от того, пытаетесь ли вы получить доступ к dom в этом коде. Если да, то оберните его, а если нет, то нет. Как уже упоминалось, в любом случае вы можете закрыть свой код, чтобы не загрязнять глобальное пространство имен или не загрязнять его, если вы этого хотите.

Ответ 4

Наконец, это факт, что я не wrapping shared.js внутри $('document'). Готовы проблемы? я обнаружив, что если я завершу это, его функции больше не доступны для код внутри страницы.

Если вы закроете свою функцию внутри документа. эта функция недоступна в глобальной области видимости, так как функция имеет локальную область действия (I.E внутри функции, где они содержатся)

Ответ 5

Ваша организация кода прекрасна, как представлено. Любые функции, определенные в "shared.js", будут доступны для остальной части вашей страницы, включая блок $('document').ready(function().

Однако, если вы поместите функции в shared.js внутри, которые блокируют, то вы ограничиваете область кода до $('document').ready(function() (т.е. ничто другое на странице не может ее использовать) - так что не путь, если вы хотите сделать материал в "shared.js" доступным для других частей вашего кода/приложения.