2017-02-21 24 views
0

Почему следующий код дает 'неопределенными' внутри выходного

(function(){ 
 
    console.log(1); 
 
    setTimeout (function(){console.log(2);},1000); 
 
    setTimeout (function(){console.log(3);},0); 
 
    console.log(4); 
 
})();

Выход:

1 
4 
undefined 
3 
2 

Почему неопределенная на выходе?

+0

тестируют вы это в консоли Google Chrome? –

+0

См. Фрагмент, в котором нет 'undefined', если вы ничего не записываете где-нибудь! –

+0

Я тестировал хром-консоль. –

ответ

2

Это потому, что возвращаемое значение функции равно undefined. Так что первый журнал 1,4, return value of function то он будет регистрировать значения от SetTimeout

Например

(function(){ 
    console.log(1); 
    setTimeout (function(){console.log(2);},1000); 
    setTimeout (function(){console.log(3);},0); 
    console.log(4); 
    return 'xyz' 

})(); 

Выход будет

1,4,'xyz',3,2 
4

undefined - это возвращаемое значение вашей функции. Он печатает undefined, если вы делаете это в консоли браузера, потому что он автоматически печатает результат вашей функции.

+0

Я имею в виду один наверху. – Bigdragon

+0

@ LKTN.25 есть один! Это похоже на 'somevar =/* код, размещенный в вопросе * /;' поэтому это технически только IIFE, который считает, что другие обернуты внутри самого ИИФ! –

5

Если вы делаете это в консоли самого браузера, затем всякий раз, когда вы console.log печатает неопределенными см эту тему:

Chrome/Firefox console.log always appends a line saying undefined

И есть множество других нитей, объясняющие, почему это происходит ,

Если это не в консоли, но в вашем JS самого файл, то есть что-то еще где-то в вашем коде, что делает его

1

неопределенным является возвращением функции, вы можете попробовать ниже код:

(function(){ 
     console.log(1); 
     setTimeout (function(){console.log(2);},1000); 
     setTimeout (function(){console.log(3);},0); 
     console.log(4); 
     return 5; 
    })();