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&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" доступным для других частей вашего кода/приложения.