2015-01-17 5 views
0

У меня есть вопрос, который может быть очевиден для опытных программистов JavaScript (я больше разработчик бэкэнда/БД). Итак, если это слишком просто, пожалуйста, несите меня!JavaScript: инициализировать глобальную переменную в функции

У меня есть этот код:

var skill = "JavaScript"; 

function printSkill() { 
    console.log(skill); // <-- This prints undefined 
    var skill = "Java"; // <-- How can this possibly work? 
    console.log(skill); // <-- This prints "Java" 
} 

printSkill(); 

Выход есть:

неопределенными
Java

Я понимаю, что можно запустить этот код, поскольку JavaScript не составлен, он интерпретируется во время выполнения (это не будет компилироваться в например C++). Но почему этот код работает? Например. почему undefined зарегистрирован вместо "JavaScript", что было бы очевидным выбором, когда дело доходит до правил определения области, например. C++. И, как получилось, что второй журнал печатает «Java», не будет ли это также undefined?

+0

попробуйте сохранить в переменном окне 'window.skill =«JavaScript»,' затем утешать войти в функции будет 'console.log (window.skill)' –

ответ

2

JavaScript разобран двумя проходами. Сначала он находит все объявления функций и переменных, а затем выполняет код. Это означает, что для компилятора, ваш код выглядит следующим образом:

// declaration 
var skill = undefined; 

// declaration 
function printSkill() { 

    // declaration 
    var skill = undefined; 

    // execution 
    console.log(skill); 
    skill = "Java"; 
    console.log(skill); 
} 

// execution 
skill = "JavaScript"; 
printSkill(); 

Это явление называется многим как «грузоподъемный», но они совершенно не «подняли». Это просто, как компилятор работает через ваш код.

Чтобы решить проблему:

  • Если вы имели в виду, чтобы заменить skill внутри рамки для Java, а затем переместить объявление и определение на вершине, прежде чем делать что-нибудь с ним.

  • Если вы имели в виду, чтобы заменить глобальный skill, а затем удалить var на skill внутри функции.

+1

Хорошо, это полностью объясняет это. Не самая красивая вещь в языке;) –

-1

Это то, что происходит за кулисами:

var skill = "JavaScript"; 

function printSkill() { 
    var skill; // skill is undefined and scoped to printSkill, 
       // it is no longer the same `skill` variable 
    console.log(skill); // <-- This prints undefined 
    skill = "Java"; // <-- How can this possibly work? 
    console.log(skill); // <-- This prints "Java" 
} 

printSkill(); 

Это называется переменная hoisting.

+0

Может ли downvoter говорить. Я не кусаю. – Oleg

0

Не используйте var ключевое слово, чтобы создать глобальный масштаб:

var skill = "JavaScript"; // global variable 

function printSkill() { 
    console.log(skill); // <-- This prints JavaScript 
    skill = "Java"; // remove "var" to keep it global 
    console.log(skill); // <-- This prints "Java" 
} 

printSkill(); 

Проблема заключается в том, что при объявлении его:

var skill = "Java"; 

внутри функции вы делаете счет этого skill переменного локальным функционирования объем. Следовательно, внутри функции first print statement выдает undefined, так как в то время локальная переменная не определена.

+0

Ключевое слово * var * все равно должно использоваться только в требуемом объеме. – RobG

+0

Да 'var' можно использовать снаружи, но не внутри, я добавил некоторые объяснения. – anubhava

0

эта функция называется Подъемно в JavaScript , когда ваш код работает, ваш код будет:

var skill; function printSkill() { 
    var skill; 
    console.log(skill); // <-- This prints undefined 
    var skill = "Java"; // <-- How can this possibly work? 
    console.log(skill); // <-- This prints "Java" } 

var skill = "JavaScript"; 
printSkill(); 
0

Это называется scoping and hoisting. Есть два типа области видимости в JavaScript, они являются глобальный ареал и развлечения фикция scope.In Javascript функция создает свой собственный scope.So код эквивалентен


var skill; // hoisted at the top of global scope and undefined 

skill = "JavaScript"; // value assigned to it 

function printSkill() { 

    var skill; //--> Hoisted at the top of function's scope and it is undefined 

    console.log(skill); // <-- So this prints undefined 

    skill = "Java"; // <-- here it is assigned a value "java" 

    console.log(skill); // <-- This prints "Java" 

} 

printSkill(); 

Теперь перейдет ко второй переменной квалификации внутри printSkill(). У него есть собственная область. Это называется функцией scope.And все переменные, которые определены внутри этой функции, поднимаются вверху области действия оболочки, не в глобальном масштабе.


Итак, когда вы console.log() variable skill внутри pritSkill() первых она выглядит в функциях scope.If он не находит его там, то это будет выглядеть до в объеме chain.In вашего дела он находит навык, поднятый в верхней части функции, но ему не присваивается никакого значения. Так first console.log() печатает undefined.


Во втором console.log() он находит навык назначенную value.So печатает значение, которое присваивается навык

+1

Существует также область охвата. Кроме того, текущий контекст выполнения описан в спецификации как находящийся в [* top of the stack *] (http://ecma-international.org/ecma-262/5.1/#sec-10.3) контекстов выполнения, поэтому разрешение идентификаторов продолжается по стеку. ;-) – RobG

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