试图完全理解JavaScript提升

时间:2011-09-22 14:11:45

标签: javascript hoisting

修改 看起来这是我的一个问题和我对jsfiddle的使用:?

我最近读了几篇关于吊装的文章,一篇是by Nicholas Zakas,另一篇是by Ben Cherry

我试着按照这些例子进行测试,然后自己测试以确保我完全掌握它,但我主要在这个例子中遇到问题,

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);
})();

fooundefined,未定义baz。这里有两个例子fiddle。真的只是想绕过这个。这些文章写的可能会有变化吗?如果有人能对此有所了解,我们将不胜感激。我在测试时使用Chrome 14。

5 个答案:

答案 0 :(得分:7)

将小提琴中的wrap更改为no wrap(head)

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

答案 1 :(得分:2)

在第二个例子中,hoisting将代码转换为:

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

因此在第一次调用日志时未定义foo。声明总是被提升到封闭函数的顶部,但是永远不会随之提升赋值。

答案 2 :(得分:2)

您将JSFiddle设置为onLoad,因此var a的范围限定为onLoad函数。将其更改为no wrap即可获得:

undefined
undefined
Uncaught ReferenceError: baz is not defined

答案 3 :(得分:1)

object.a === undefined; // true,但a in object; // true

var object = {a: undefined};

('a' in object); // is true because a is a property of object

答案 4 :(得分:0)

吊装的理解有所不同,但我理解它的作用是

无论何时创建变量/函数,它都会为您设置一个内存空间。它不会将变量/函数放在执行上下文的顶部。

在控制台中键入“this / window”,你会发现你的var / functions位于词汇中。

例如:

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

如果它在执行期间被置于顶部,那么它应该输出'Hello'而不是'undefined'函数将被执行。变量将不会被执行。 宣布声明后,请避免提升执行:

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

b(); //returns Hello World