Вопрос о ссылках на функции в Javascript

Проблема: У меня есть тяжелая страница jQuery, которая имеет встроенный интерфейс администратора. Функции администратора запускаются только при установке переменной администратора. Эти функции требуют, чтобы вторая библиотека работала правильно, а второй файл включается только в том случае, если пользователь является администратором при первой странице. Эти функции никогда не будут запускаться для обычных пользователей, и обычные пользователи не получают включение для второй библиотеки.

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

псевдокод:

header: (обратите внимание, что admin.js не включен)

<script type="text/javascript" src="script.js"></script>
<script type="text/javascript" src="user.js"></script>

script.js: (функции администратора указаны, но не могут быть выполнены)

admin = false; // Assume this

$(".something").dblclick(function(){
 if(admin)
  adminstuff(); // Implemented in admin.js (not included)
 else
  userstuff();
});

Идеи: Я полагаю, что можно использовать два отдельных файла для пользователей и админов, но я считаю, что это будет слишком сложное решение (не нужно поддерживать два больших файла с несколькими линиями разницы). Единственная причина, по которой я включаю ссылку на функцию администратора в этом файле, - это привязать ее к элементам страницы, которые обновляются как часть script. Когда jQuery обновляет страницу, мне нужно повторно привязать функцию к интерактивным элементам.

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

Ответ 1

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

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

Если вы уже выполняете проверку подлинности/разрешения на стороне сервера для вызовов функции администратора, просто игнорируйте мой предыдущий абзац: -)

Ответ 2

Лично я привязывал (или перевязывал) событие в admin.js:

$(function() {

$(".something").dblclick(function(){
  adminstuff();
});

});

function adminstuff()
{
  // ...
}

Таким образом, вызов adminstuff() и функция не будут видны "обычным" пользователям.

Ответ 3

Хороший вопрос. Это не должно вызывать проблем с JavaScript.

Другие вещи, которые следует учитывать: вы потенциально раскрываете свои возможности администратора миру, когда вы это делаете, что может быть полезно для хакеров. Это, вероятно, не очень беспокоит, но это то, о чем нужно знать.

См. также:

Почему я могу использовать функцию до ее определения в Javascript?

Ответ 4

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

Ответ 5

Я не думаю, что на мой взгляд это догматический ответ. То, что вы делаете, является... творческим. Если вам это не нравится, это может быть признаком для рассмотрения других вариантов. Но если вы даже менее комфортно относитесь к тем, то это может быть признаком того, что это правильно (или, может быть, наименее ошибочное). В конечном счете вы могли бы смягчить путаницу, комментируя черт из этой строки. Я бы не позволил себе быть религиозным в отношении лучших практик. Просто будьте готовы встать по вашему выбору. Во всяком случае, вы все это оправдали.

Ответ 6

Javascript динамичен - ему все равно, если функции не определены.

Если вы поместите свои функции администратора в объект пространства имен (вероятно, это хорошая практика), у вас есть несколько вариантов.

  • Проверить наличие функции в объекте admin
  • Проверьте наличие объекта admin (возможно, заменив ваш флаг)
  • Вместо этого должен быть объект операции, где файл администратора заменяет функции выбора при загрузке. (Еще лучше, используйте прототипное наследование, чтобы скрыть их.)

Ответ 7

Я думаю, вам следует опасаться, что вы настроитесь на серьезные проблемы с безопасностью. В firebug довольно просто изменить переменную, такую ​​как admin, на "true", и, увидев, что admin.js общедоступен, его недостаточно, чтобы просто не включать его на страницу, так как также просто добавить еще один script на страницу с помощью firebug. Умеренно осведомленный пользователь может легко предоставить себе права администратора в этом сценарии. Я не думаю, что вам следует полагаться только на модель безопасности на стороне клиента.