2016-07-02 1 views
1

ПочемуФункция грузоподъемная в JavaScript из условия заявления

var y = 1; 
    if (function f(){}) { 
    y += typeof f; 
    } 
    console.log(y); // 1undefined 

Перед запуском кода я предполагаю, что это будет 1function

Я полагаю, что за функциями Подъемного е должен быть открыт для всего кода. Можете ли вы предоставить ссылку на такое описание поведения?

P.S> в блоге, где я нашел этот пример есть объяснение

Выход будет 1undefined. Оператор if оценивает использование eval, поэтому eval (функция f() {}) возвращает функцию f() {} (что верно). Поэтому внутри оператора if выполнение типа f возвращает undefined, потому что код инструкции if выполняется во время выполнения, а оператор внутри условия if оценивается во время выполнения.

Но это не делает ситуацию более ясным

+0

В чем вопрос? и какова цель? –

+0

Я полагаю, что это будет '1функция' –

+0

Я знаю, но почему вы пытаетесь это сделать? вы можете привести пример в реальном мире? Мне просто интересно –

ответ

3

Путаница в том, что синтаксис function fName() {} неоднозначен и зависит от контекста.

В одиночку это декларация функции и поэтому поднята. Но в определенных контекстах это выражение (названное), и, следовательно, нет.

Вот почему вы видите, что IIFE объявлены как (function() {..})() или !function() {..}(), чтобы заставить их быть выражением функции, а не декларациями.

Важная информация о названных функциональных выражениях заключается в том, что их имя по существу является локальным для самой функции и не доступно вне этой функции. Вот почему += f добавляет undefined в ваш код.

Конечно, это совершенно бессмысленно. Почему кто-нибудь в здравом уме написал такой код? Поэтому я хотел бы оставить вас с этим: https://youtu.be/RAA1xgTTw9w :)

Смежные вопросы