Вопрос о вызове функций из других файлов - Javascript

Я ищу помощь в понимании чего-то в проекте, над которым я работаю. Я написал некоторый код, который работает, хотя я не уверен, почему.

На сервере Node.js в /public/js есть два скрипта. Один (file1.js) имеет функцию func(). file2.js в том же каталоге успешно вызывает func(). Нигде нет module.exporting или requireing, но эти два файла работают вместе. Однако они оба упоминаются в файле index.ejs. Здесь они становятся способными общаться?

//file1.js
function func() {
    console.info("foo")
}
//file2.js

func()
//index.ejs
...
<script src = "public/js/file1.js"></script>
<script src = "public/js/file2.js"></script>
...

Целый день читаю и ничего не могу найти по этой теме.

Тег script заставляет логику извлекать и включать источники файлов в файл, как если бы они были встроенными. Как только файл file1.js будет обработан, все ресурсы, которые он определяет глобально, будут доступны с этого момента.

Taplar 27.05.2019 19:12

«Именно здесь они становятся способными общаться?». Абсолютно.

TGrif 27.05.2019 19:13

Я думаю, что путаница здесь заключается в том, что «вызывается из другого файла». Он не вызывается из другого файла. Этот файл извлекается и обрабатывается в вашем основном файле. Фактическое выполнение вызова происходит из основного файла.

Taplar 27.05.2019 19:15

Потрясающе, спасибо!

jsarbour 27.05.2019 19:15

Продолжите, тогда зачем module.exports вообще необходим?

jsarbour 27.05.2019 19:15

@jsarbour Это статические файлы javascript, которые анализируются и выполняются браузером. Браузер не поддерживает синтаксис module.exports. Возможно, вы захотите просмотреть этот пост – matteoagosti.com/blog/2013/02/24/…

Divya Mamgai 27.05.2019 19:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
32
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны понимать, как глобальное пространство ведет себя в Javascript.

Этот код:

<script src = "public/js/file1.js"></script>
<script src = "public/js/file2.js"></script>

То же, что:

<script>
    //file1.js
    function func() {
        console.info("foo");
    }

    func();
</script>

Потому что, как только file1.js загружается, все, что определено внутри него, становится доступным в любом месте той страницы, где оно было включено.

Поскольку file2.js использует содержимое file1.js, это будет работать, потому что func доступен для использования в любом месте ниже включения file1.js.

Спасибо! Тогда почему модуль module.exports() и необходимость локального файла всегда необходимы? Это потому, что такие файлы не указаны в файле index.ejs?

jsarbour 27.05.2019 19:25

Я думаю, вы что-то путаете здесь. При экспорте модуля вы хотите, чтобы содержимое, которое вы экспортируете, было доступно с помощью вызова «import». Так что этот ответ предназначен только для вашего обычного приложения и не связан с какими-либо модулями.

Mosia Thabo 27.05.2019 19:34

импорт? Не требуется ()?

jsarbour 27.05.2019 19:35

Те модули, о которых вы говорите, основаны на сервере. и Не в браузере. Таким образом, вы не можете поместить файл, который вам нужно использовать, в браузере на сервисных модулях.

Mosia Thabo 27.05.2019 19:36

@jsarbour Вы должны проверить мой комментарий к вопросу. Там есть ссылка на статью, которая может помочь вам понять эти концепции.

Divya Mamgai 27.05.2019 19:37

Да, require() не импортируется, извините, чувак. лол, я много делаю Type Script с Angular, вот почему. Извини за это.

Mosia Thabo 27.05.2019 19:37
Ответ принят как подходящий

Ваш вопрос о том, как JavaScript работает в браузере.

Node.js здесь неуместен. Все, что он делает, — это запускает программу HTTP-сервера, которая передает браузеру статические файлы.

Когда вы загружаете скрипт в браузер с помощью элемента скрипта (и не используете type = "module"), любая переменная в самой внешней области действия файла скрипта (например, которая не находится let внутри блока или var внутри функции) становится Глобальный и доступен для любого другого скрипта, загруженного таким же образом в тот же HTML-документ.

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

Вот почему люди начали использовать такие методы, как раскрывающийся шаблон модуля, и почему модули AMD и Узел были разработаны до того, как стандартные модули JavaScript был добавлен в спецификацию.

Другие вопросы по теме