Почему этот скрипт работает? (и другие вопросы) [JavaScript]

Для начала я хотел бы сказать, что я новичок в javascript. ОЧЕНЬ новый.

Вопросы, которые у меня есть, касаются этого простого (googled) сценария:

window.onload = function(){
    bobby();
        function bobby(){
            document.getElementById('print').innerHTML = "Hello World"
        }
    }

Конечно, я знаю, ЧТО он делает (он помещает строку «Hello World» в элемент с идентификатором «print»), и он тоже работает. Однако я понятия не имею, ПОЧЕМУ это работает. Если бы я использовал-

window.onload = function(){
        function bobby(){
            document.getElementById('print').innerHTML = "Hello World"
        }
    }

или-

window.onload = bobby(){
    function bobby() {
        document.getElementById('print').innerHTML = "Hello World";
    }
}

вместо этого он не будет работать, несмотря на то, что выглядит так, как должен (для первокурсника вроде меня).

Мои вопросы таковы: что происходит за кулисами? Что идет не так / что идет правильно? Есть ли что-то устаревшее/отсутствующее в приведенных выше сценариях? На что я должен обратить внимание? Почему сначала это должна быть функция, почему я не могу использовать только строку, которая фактически выполняет скрипт?

javascript.info/first-steps
bill.gates 10.12.2020 13:08

Первый фрагмент работает, потому что bobby() не только объявляется, но и вызывается, в отличие от других фрагментов.

Nico Haase 10.12.2020 13:10

Просто для ясности, хотя комментарий Нико Хаасе отвечает на ваш вопрос, обычно не считается хорошей практикой вызывать функцию до того, как вы ее объявили (что работает только из-за подъема объявления функции). Другими словами, тот фрагмент кода, который вы нашли, не очень хорош.

Jared Smith 10.12.2020 14:06

Рад видеть все ответы, спасибо всем :) И спасибо, что указали, почему это не очень хороший фрагмент Джаред Смит, каждая мелочь помогает

RxS 10.12.2020 14:17
Поведение ключевого слова "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) для оценки ваших знаний,...
3
4
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В первом фрагменте кода (который работает) вы объявляете функцию ("function bobby()...") и выполняете ее "bobby();" И все это выполняется анонимной функцией, которая запускается по событию окна загрузки.
Второй фрагмент кода объявляет только функцию bobby().
С третьим я не знаком, но похоже, что вы выполняете функцию bobby(), а внутри нее есть объявление внутренней функции bobby()

Ответ принят как подходящий

Давайте разберемся, почему этот код работает:

window.onload = function(){
    bobby();
        function bobby(){
            document.getElementById('print').innerHTML = "Hello World"
        }
    }

windows.onload

Вы можете назначить функцию windows.onload, и в какой-то момент (когда браузер завершит загрузку ресурса) она будет вызвана, что-то вроде windows.onload()

В вашем случае windows.onload() собирается выполнить анонимную функцию с помощью этого кода:

function()
{ // from here
    bobby();
        function bobby(){
            document.getElementById('print').innerHTML = "Hello World"
        }
    
} // to here

во втором фрагменте, когда код запускается, только объявляйте функцию, но никогда не запускается.

ссылка MDN

Функция bobby и bobby call

рассмотрим теперь функциональное выражение

function(){
    bobby();
    function bobby(){
         // some code
    }
}

Я подозреваю, что вам интересно, почему вызов функции предшествует объявлению функции.

Когда функция объявлена ​​как bobby во фрагменте, компилятор javascript перемещает объявление в начало области видимости (подъем), поэтому при запуске код работает следующим образом:

function(){ // <-function scope beginning
    function bobby(){
         // some code
    }

    bobby();
}// <-function scope end

Но это только так в объявлении функций, а не в выражениях функций. учти это:

function(){
    bobby();
    bobby2();
    function bobby(){ // some code}
    let bobby2 = function(){ // some code}
}

после компиляции будет выглядеть так:

function(){
    function bobby(){ // some code}
    let bobby2;

    bobby(); // works
    bobby2(); // fails because bobby2 is not a function (yet)

    bobby2 = function(){ // some code}
}

Надеюсь, это поможет понять.

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