如果在声明变量之前使用变量,为什么不抛出ReferenceError?

时间:2016-02-18 05:21:38

标签: javascript variable-declaration referenceerror hoisting

我试图围绕JavaScript引发的引用错误行为。

在以下示例中,第二行抛出ReferenceError,执行中断:

var obj = {};
obj.func1 = func2;

alert('Completed');

然而在此示例中,代码成功完成,但obj.func1仍为undefined

var obj = {};
obj.func1 = func2;

var func2 = function() {
    alert('func2');
};

alert('Completed');

我的假设是,第二行会出现错误,但事实并非如此,我希望obj.func1正确引用func2,但我双盲。那究竟发生了什么?

3 个答案:

答案 0 :(得分:4)

这是由于Javascript变量声明“悬挂”。

使用var声明的变量在函数中的任何位置都可见,因此没有Reference Error。但是,在执行初始化它的语句之前,它实际上不会收到它的值。所以你的第二个例子相当于:

var func2;
var obj = {};
obj.func1 = func2;

func2 = function() {
    alert('func2');
};

alert('Completed');

在此重写中,您可以在执行obj.func1的分配时看到该变量存在。但由于它还没有值,因此您将undefined分配给obj.func1。稍后分配给func2不会改变它。

答案 1 :(得分:3)

var被悬挂;变量存在于整个当前范围内。因此,第二个例子相当于:

var obj;
var func2;

obj = {};
obj.func1 = func2;
func2 = function() {
    alert('func2');
}

alert('Completed');

因此,当您执行作业时,名称func2已知,但undefined。在第一个例子中,它是未知的,它引发了ReferenceError

答案 2 :(得分:1)

您的func2变量不可见。这就是为什么obj.func1仍未定义的原因。



var obj = {};
var func2 = function() {
    alert('func2');
    return "Test";
};
    
obj.func1 = func2;
   
alert('Completed');