Прежде всего, добавление пользовательских, произвольных свойств в document
не рекомендуется, например:
document.__data = { ... };
вместо этого сделайте что-то вроде, например
var data = { ... };
СейчасПредполагая, что вы хотите получить доступ к встроенным данным, используя внешний файл app.js
, этот файл необходимо загрузить после вашего встроенного файла, иначе он вернется undefined
.
Вот как это должно выглядеть в вашем HTML:
<head>
</head>
<body>
<script>
var data = {
id: 1,
text: 'Test blob',
};
</script>
<script src="app.js"></script>
</body>
И ваш app.js
const getData = () => console.log(data);
getData();
Если ваш внешний app.js
загружается в head
, как и в исходном HTML, вам нужно отложить getData()
, пока DOM не будет готов, и вот как он должен выглядеть в вашем app.js
:
const getData = () => console.log(data);
window.addEventListener('DOMContentLoaded', (event) => {
getData();
});
И причина в том,просто вы не можете получить доступ к тому, что будет позже в документе, поскольку он еще не загружен, поэтому проблема undefined
в вашем первом примере.
Ниже двух фрагментов используйте встроенный скрипт, чтобы вы могли видетькак это устроено. Просто замените деталь getData()
на app.js
, и она также будет работать.
Показывает, что она работает, когда DOMContentLoaded
закончена.
<head>
<script>
const getData = () => console.log(data);
window.addEventListener('DOMContentLoaded', (event) => {
getData();
});
</script>
</head>
<body>
<script>
var data = {
id: 1,
text: 'Test blob',
};
</script>
</body>
Показывает, что это не работает, если не откладывается до завершения DOM
<head>
<script>
const getData = () => console.log(data);
getData();
</script>
</head>
<body>
<script>
var data = {
id: 1,
text: 'Test blob',
};
</script>
</body>