修改 看起来这是我的一个问题和我对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);
})();
foo
为undefined
,未定义baz
。这里有两个例子fiddle。真的只是想绕过这个。这些文章写的可能会有变化吗?如果有人能对此有所了解,我们将不胜感激。我在测试时使用Chrome 14。
答案 0 :(得分:7)
将小提琴中的wrap
更改为no wrap(head)
答案 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