5

编辑 看起来这是我的一个问题,我对 jsfiddle 的使用:?

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

我试图按照这些示例进行测试,以确保我完全掌握它,但我主要遇到这个示例的问题,

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

而不是记录undefined其 logging 1。如果我正确理解所有内容,a应该是undefined,因为它应该存在于窗口范围内,因为 var 语句被提升到顶部,所以它不应该被赋值。

但以下是按预期行事,

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

fooundefined,并且baz没有定义。我对这两个例子都很感兴趣。真的只是想解决这个问题。自从写了这些文章以来,有什么变化吗?如果有人能对此有所了解,将不胜感激。我在测试时使用 Chrome 14。

4

5 回答 5

7

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

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

于 2011-09-22T14:17:30.847 回答
2

在第二个示例中,提升将代码转换为:

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

所以 foo 在第一次调用 log 时是未定义的。声明总是被提升到封闭函数的顶部,但赋值永远不会被提升。

于 2011-09-22T14:19:49.850 回答
2

您已将 JSFiddle 设置为onLoad,因此var a范围仅限于 onLoad 函数。将其更改为no wrap,您将获得:

undefined
undefined
Uncaught ReferenceError: baz is not defined
于 2011-09-22T14:21:21.753 回答
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
于 2011-09-22T14:20:54.413 回答
0

起重的理解不同,但据我了解,它的作用是

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

在控制台中键入“this/window”,您会发现您的 var/functions 以词法方式坐在那里。

例如:

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

如果它在执行期间被置于顶部,那么它应该输出“Hello”而不是“未定义”函数将被执行。变量不会被执行。请避免在声明变量后对其执行提升:

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

b(); //returns Hello World   
于 2015-07-23T18:58:02.647 回答