Javascript 如果在变量之前使用了变量’;谁宣布的?

Javascript 如果在变量之前使用了变量’;谁宣布的?,javascript,variable-declaration,referenceerror,hoisting,Javascript,Variable Declaration,Referenceerror,Hoisting,我试图对JavaScript中抛出的引用错误的行为了如指掌 在以下示例中,在第二行抛出ReferenceError,执行中断: var obj = {}; obj.func1 = func2; alert('Completed'); 然而,在本例中,代码成功完成,尽管obj.func1仍然未定义: var obj = {}; obj.func1 = func2; var func2 = function() { alert('func2'); }; alert('Complete

我试图对JavaScript中抛出的引用错误的行为了如指掌

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

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

alert('Completed');
然而,在本例中,代码成功完成,尽管
obj.func1
仍然
未定义

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

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

alert('Completed');

我的假设是,第二行同样会抛出一个错误,如果不是这样的话,我本希望
obj.func1
正确引用
func2
,但我一直是双盲。那么这里到底发生了什么呢?

var
被提升;该变量存在于当前范围内。因此,第二个示例相当于:

var obj;
var func2;

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

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

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

alert('Completed');

因此,在执行赋值时,名称
func2
已知,但
未定义。在第一个示例中,它是未知的,这会引发
ReferenceError

这是由于Javascript变量声明“highting”

var
声明的变量在函数中随处可见,因此没有
引用错误。但是,在您执行初始化它的语句之前,它实际上不会收到它的值。因此,您的第二个示例相当于:

var obj;
var func2;

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

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

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

alert('Completed');

在这次重写中,您可以看到,当您对
obj.func1
执行赋值时,变量存在。但是,由于它还没有值,因此可以将
undefined
赋值给
obj.func1
。以后分配给
func2
不会改变这一点。

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

var obj={};
var func2=函数(){
警报('func2');
返回“测试”;
};
obj.func1=func2;

警报(“已完成”)
和@epascarello:没有函数表达式的函数;仅悬挂功能语句。这是
var
提升。
obj
的初始化与其声明相关联的原因是什么?我理解,因为它会立即发生,无论如何,没有实际的区别,但这是直译吗?他在初始化之后才引用
obj
,所以在声明期间或之后初始化它实际上没有区别。因此,我没有费心重写这一部分,因为它与问题无关。我想我只是想提出一个问题,如果你的示例的想法是声明被独占地提升,那么它是否会稍微掩盖行为。声明和初始化之间的区别只在你尝试在声明之前使用变量时才起作用。如果所有的使用都在之后,则没有区别,因此没有必要显示重写。我很清楚,在分配
func1
之前定义
func2
可以解决错误。这不是一个真正的问题,只是我在修补过程中发现了一些奇怪的东西。