2012-03-30 3 views
2

Я понимаю, почему следующее предупреждение() возвращает «синий».идентификатор lookup conundrum

var color = "blue"; 
function getcolor() { 
return color; 
color = "red"; 
} 
alert(getcolor()); 

Если я не неправильно, то функция прекращает выполнение после его возвращения заявления, предотвращение глобального «цвет» переменной от перезаписи.

Но почему, если мы изменим определение функции ниже, предупреждает ли alert() «undefined»?

var color = “blue”; 
function getcolor() { 
return color; 
var color = “red”; 
} 

alert(getcolor()); 

Я ожидал, что функция GetColor() будет завершаться после возвращения заявления, как и раньше, и возвращает значение глобальной переменной цвета «синий».

+0

Не var color = "red" установить переменную цвета local в функцию getcolor (0) - хотя она еще не пропустила функцию, которая затем вернется не определена, поскольку она не получила заявление о назначении? – Terry

ответ

0

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

var color = "blue"; 
function getcolor() 
{ 
    var color; 
    return color; 
    color = "red"; 
} 
alert(getcolor()); 

Это заявление об утверждении, которое никогда не выполняется, а не объявление переменной. И вы возвращаете локальную переменную, которая еще не определена.

2

Локальные переменные - независимо от того, где фактическая инструкция var находится в функции - создана в начале функции. Ваш последний код переводится как-то вроде;

var color = “blue”; 
function getcolor() { 
    var color; 
    return color; 
    color = “red”; 
} 

alert(getcolor()); 

, который более четко показывает, почему вы получаете эффект, который вы получаете.