Javascript - проблема подъема - PullRequest
4 голосов
/ 12 июня 2011

В коде ниже:

(function (){
    function test(){};//"function"
    var test;//"undefined"
    var printTest = typeof test;
    document.write(printTest);
})();

printTest будет отображать «function» вместо «undefined», что имеет смысл, поскольку, насколько я понимаю, любые объявления переменных всегда «поднимаются» в верхнюю часть контекста выполнения (в данном случае это контекст выполнения функции) объявление функции "test ()" будет тем, которое появится позже в текущем контексте выполнения. Теперь рассмотрим этот код, где я фактически присваиваю значение объявлению var "var test = 1".

(function (){
        function test(){};
        var test=1;//assign value to a variable here
        var printTest = typeof test;
        document.write(printTest);
    })();

Затем printTest теперь отображает «число», что означает, что контекст выполнения теперь поддерживает другой порядок. Может кто-нибудь объяснить, что на самом деле здесь произошло?

Ответы [ 2 ]

2 голосов
/ 12 июня 2011

Подъем отделяет фактическое назначение от объявления переменной. Что он действительно делает, так это:

(function (){
        var test, printTest;
        test = function (){};
        test = 1;//assign value to a variable here
        printTest = typeof test;
        document.write(printTest);
    })();
2 голосов
/ 12 июня 2011

var test означает только то, что все, что называется тестом, должно иметь локальную область видимости.Он не определен только потому, что вы не присвоили ему значение (за исключением того, что у вас есть function test(){};, поэтому вы получаете function, а не undefined).

Во втором примере function test(){}; все еще назначает ему функцию, но затем var test=1; перезаписывает ее с помощью 1.Вы используете typeof после , присваивая ему 1, поэтому он сообщает, что это число.

...