在JavaScript中,为什么在实例化之前无法访问对象,这与函数声明不同,函数声明将声明移动到其作用域的顶部,并且无论其在文字代码中的位置如何都可以被调用。
示例:
for(var property in myObj)
alert(myObj[property].toString());
var myObj = {
property1: "chocolate",
property2: "cake",
property3: "brownies"
}
在控制台中,上面甚至没有任何错误/日志条目。为什么呢?
答案 0 :(得分:4)
因为这就是语言的设计方式。仅提升函数声明和变量声明(但不初始化)。所以你的代码真的是:
var myObj = undefined;
var property = undefined;
for(property in myObj)
alert(myObj[property].toString());
myObj = {
property1: "chocolate",
property2: "cake",
property3: "brownies"
};
}
...失败不是因为变量myObj
尚不存在(确实存在),但是因为该变量的值为undefined
,所以你不能使用{{1} } for-in
。
如果你考虑它,它是合理的:一个函数声明只根据自己的内容创建一个工作单元(一个函数),然后执行以后(任何变量它)关闭以后的 ,当它被执行时),但是对象初始化可以依赖于其他事情(如变量等),这些事情需要在初始化时进行评估,而不是以后。
示例:
undefined
var answer = 42;
var obj = {
property: answer
};
和obj
的声明已被提升,但我们无法提升我们分配给answer
的对象的创建,因为它必须使用obj
变量的值来初始化属性answer
。
相反:
property
var answer = 42;
foo();
function foo() {
console.log("The answer is " + answer);
}
的声明和answer
函数的声明/创建都被悬挂,这没关系,因为虽然foo
使用foo
,但它没有使用它直到以后,当它被调用时。
答案 1 :(得分:0)
这是因为函数只声明了定义,并且这个定义可以在所有代码中都可见。当然在适当的范围内。
function test() {
}
但是,通过定义变量,您可以创建物理对象。它是在执行这行代码时创建的,所以它在之前不可见。
var testData = {};
var testFunction = function() {
}
答案 2 :(得分:0)
首先,提升使得此代码的工作方式如下:
var myObj = undefined;
for(var property in myObj)
alert(myObj[property].toString());
myObj = {
property1: "chocolate",
property2: "cake",
property3: "brownies"
}
因此,当for-in循环执行时,myObj未定义。 myObj没有属性(在那一点上未定义)这一事实使得for-in循环不会执行任何一次(这就是为什么你没有收到任何错误)。
答案 3 :(得分:0)
始终移动函数声明和变量声明 (“悬挂”)无形地到达其包含范围的顶部 JavaScript解释器。
身体悬挂功能。所以你有完整的功能,可以在任何地方调用。
不会悬挂变量作业。只有名称声明。这个 不是函数声明的情况,其中整个函数 身体也将被悬挂。
所以:
console.log(i); // i is undefined
var i = 1; // value is assigned
console.log(i) // now we get the value
i
在任何地方都可见(undefined
为值),因为解释器已将其提升到范围顶部。但尚未分配。它指定执行何时到达该行代码。
答案 4 :(得分:-1)
这取决于您如何定义function
。
例如,此function
也不可用:
func();
// This is a function expression instead of a declaration
var func = function() {};
在一天结束时,在实例化之前不能使用对象文字(请参阅我不是说声明),因为它存储在引用中(即变量)在声明之前不会存在!
声明功能时......
doStuff();
function doStuff() { }
...有效,因为一旦JavaScript运行时已经解析了代码就会声明doStuff
,而在实际命中代码时会将函数设置为某个变量。
对象文字被分配给某个变量,在声明变量之前你将无法访问它。这是解释您关注的最简单方法。