Попытка полностью понять подъем JavaScript - PullRequest
5 голосов
/ 22 сентября 2011

Редактировать Похоже, это была проблема с моей стороны и моего использования jsfiddle:?

В последнее время я читал пару статей о подъеме, одна из них Николаса Закаса , а другая Бен Черри .

Я пытаюсь следовать примерам и просто протестировать самостоятельно, чтобы убедиться, что я полностью понимаю, но у меня возникла проблема в основном с этим примером,

if (!('a' in window)) {
    var a = 1;
}
console.log(a);

Вместо регистрации undefined это регистрация 1. Если я все правильно понимаю, a должно быть undefined, потому что оно должно существовать в области видимости из-за оператора var, поднимаемого вверх, поэтому ему не должно быть присвоено значение.

Но следующее действует, как и ожидалось,

(function bar(){
    console.log(foo);
    var foo = 10;  
    console.log(baz);
})();

foo равно undefined, а baz не определено. У меня есть скрипка здесь с обоими примерами. На самом деле просто пытаюсь обернуть мою голову вокруг этого. Что-то изменилось с тех пор, как эти статьи были написаны? Если кто-то может пролить свет на это, это будет оценено. Я использую Chrome 14 при тестировании.

Ответы [ 5 ]

7 голосов
/ 22 сентября 2011

Измените wrap в скрипте на no wrap(head)

http://jsfiddle.net/rlemon/VjCqF/3/

2 голосов
/ 22 сентября 2011

JSFiddle имеет значение onLoad, поэтому var a ограничено функцией onLoad. Измените его на no wrap, и вы получите:

undefined
undefined
Uncaught ReferenceError: baz is not defined
2 голосов
/ 22 сентября 2011

Во втором примере подъем поднимает код в следующее:

(function bar(){
    var foo;
    console.log(foo);
    foo = 10;  
    console.log(baz);
})();

Таким образом, foo не определен во время первого вызова log.Объявление всегда поднимается в верхнюю часть функции включения, но назначение никогда не поднимается вместе с ним.

1 голос
/ 22 сентября 2011

object.a === undefined; // true, но a in object; // true

var object = {a: undefined};

('a' in object); // is true because a is a property of object
0 голосов
/ 23 июля 2015

Под подъемом понимают по-разному, но, насколько я понимаю, это означает:

Каждый раз, когда вы создаете переменную / функцию, она устанавливает пространство памяти для вас. Она не помещает переменную / функции в начало выполненияcontext.

Наберите «this / window» в консоли, вы найдете лексические переменные var / functions.

, например:

a; //returns undefined 
b(); //returns Hello World   
var a = "Hello";
    function b() {
        console.log('Hello World');
    }

Если он размещенсверху во время выполнения, тогда он должен вывести «Hello», а не «undefined», функции будут оправданы. Переменные не будут оправданы.Пожалуйста, избегайте подъема извините vars после того, как он объявлен:

var a = "Hello";
    function b() {
        console.log('Hello World');
    }
a; //returns Hello

b(); //returns Hello World   
...