Чтобы добавить к ответу @Spencer Wieczorek, определение переменной «поднято» в верхней части его области, в то время как назначение переменных остается в месте, где вы его пишете. Таким образом, код, который вы предоставили на самом деле переводится как это:
var message = "hello there!";
function hello(){
var message;
console.log(message);
if (true) {
message = "wassup?!";
}
}
hello();
Это объясняет немного более ясно, почему вы видите эти результаты - Прежде чем ваш console.log()
вызова, переменная message
создается в области видимости функции hello()
, но не получает значение 'wassup?!'
до более поздней функции.
EDIT: Here's a bit more info on this behaviour, который, как отмечает @TedHopps в комментариях, называется поднятым, а не «скрепленным».
спасибо, очень информативный –