为什么在Javascript中的instantion之前无法访问对象属性

时间:2015-12-07 10:31:08

标签: javascript javascript-objects

在JavaScript中,为什么在实例化之前无法访问对象,这与函数声明不同,函数声明将声明移动到其作用域的顶部,并且无论其在文字代码中的位置如何都可以被调用。

示例:

    for(var property in myObj)
            alert(myObj[property].toString());
        var myObj = {
            property1: "chocolate",
            property2: "cake",
            property3: "brownies"
        }

在控制台中,上面甚至没有任何错误/日志条目。为什么呢?

5 个答案:

答案 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为值),因为解释器已将其提升到范围顶部。但尚未分配。它指定执行何时到达该行代码。

enter link description here

了解详情

答案 4 :(得分:-1)

这取决于您如何定义function

例如,此function也不可用:

func();
// This is a function expression instead of a declaration
var func = function() {};

在一天结束时,在实例化之前不能使用对象文字(请参阅我不是说声明),因为它存储在引用中(即变量)在声明之前不会存在!

声明功能时......

doStuff();
function doStuff() { }

...有效,因为一旦JavaScript运行时已经解析了代码就会声明doStuff,而在实际命中代码时会将函数设置为某个变量。

TL; DR版本......

对象文字被分配给某个变量,在声明变量之前你将无法访问它。这是解释您关注的最简单方法。