Скажем, у меня есть некоторый javascript в yum.js, который определяет объект, подобный этому
/* yum.js */
var Yum = {
MY_ID: "yum@yum.yum",
MAX_PIES: 100,
pies_eaten: [],
pie_string: "blueberry",
eat_pie: function(pietype) {
alert("mmmm, " + pietype);
}
}
У меня есть HTML-файл yumtest.html, в который я хочу включить yum.js и вызвать некоторые функции. HTML выглядит как
<!-- yumtest.html -->
<html>
<head>
<script type="text/javascript" src="yum.js"></script>
<script type="text/javascript">
function run_tests() {
alert("The Yum class is type '" + typeof Yum + "'.");
alert("pie_string is '" + Yum.pie_string + "'.");
Yum.eat_pie("apple");
}
</script>
</head>
<body>
<input type="button" value="Click to run tests" onclick="run_tests()">
</body>
</html>
Это отлично работает: я могу нажать на кнопку, и предупреждение говорит мне, что "pie_string is 'blueberry'". Это хорошо.
Однако, скажем, я хочу инициализировать pie_string некоторым значением, возвращаемым функцией другого объекта. Я изменяю yum.js, поэтому pie_string создается с
pie_string: OtherObj.get_best_pie(),
//... in another file, OtherObj is defined with
get_best_pie: function() {
return "blueberry";
},
Когда я нажимаю кнопку, чтобы запустить тот же код, это не работает. yumtest.html сообщает мне «Класс Yum имеет тип« undefined »», и вызовы свойств или методов Yum.x не работают. Выполнение кода прекращается.
Вот мне и интересно:
1) Почему инициализация переменной как возвращаемого значения функции не позволяет мне включить файл в страницу HTML?
(мое текущее предположение состоит в том, что функция не может выполняться и возвращаться, когда файл анализируется и добавляется в HTML - см. дополнительную информацию ниже)
2) Есть ли способ получить сообщение об ошибке при сбое включения, или тихий сбой является нормальным / ожидаемым от JavaScript?
Дополнительная информация
Причина, по которой я спрашиваю, заключается в том, что я вижу, что это происходит в расширении Firefox. Несколько переменных инициализируются таким образом, используя
varname : Components.classes["@mozilla.org/extension-name-string;1"]
.getService(Components.interfaces.nsIPrefBranchInternal),
для загрузки различных пользовательских настроек. Это работает нормально, и расширение работает нормально, поэтому, вероятно, это допустимый код Javascript. Или, по крайней мере, - в некоторых ситуациях? Возможно, разница между выполнением как фактическим Javascript и анализом и включением в HTML препятствует запуску функции и возвращению значения?
Обход
Полагаю, одним из обходных путей было бы переопределить Yum как класс и инициализировать переменные в конструкторе.
Для тех, кто не может или не хочет преобразовывать свой код в класс, хорошая новость. Вы можете сохранить переменную, определенную на месте, но при этом включить этот файл в HTML, определив переменную как функцию и рассчитав возвращаемое значение внутри. Например, мы могли бы сделать
pie_string: function() {
// do some calculations here;
// whatever we would have done in get_best_pie()
return "blueberry";
},
Это означает, что вы должны изменить все свои вызовы с Yum.pie_string
на Yum.pie_string()
(или, возможно, вы хотите переименовать функцию 'get_pie_string()
', чтобы было понятно ...). Но файл javascript может быть включен в HTML и использоваться нормально.
уф!