我试图围绕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
,但我双盲。那究竟发生了什么?
答案 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');