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

标签 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,但我一直双盲。那么这里到底发生了什么?

最佳答案

这是由于 Javascript 变量声明“提升”。

var 声明的变量在函数中随处可见,因此不存在 Reference Error。但是,在您执行初始化它的语句之前,它实际上并没有收到它的值。所以你的第二个例子相当于:

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

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

alert('Completed');

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

关于javascript - 如果在声明变量之前使用变量,为什么不会抛出 ReferenceError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35473439/

相关文章:

javascript - 在 primefaces 数据表上使用监听器执行行单击

javascript - 声明与初始化变量?

javascript - 从基于属性模式的对象中获取值?

javascript - 如何在窗口调整大小时覆盖我的数组?

c++ - 何时在C++中使用extern

javascript - 使用 `let` 重新声明变量会导致 “Uncaught SyntaxError: redeclaration of let …”

javascript - 如何在不出现引用错误的情况下将不存在的 JavaScript 对象与 undefined object 进行比较?

javascript - 我收到以下错误 ReferenceError : document is not defined when running my html code in Cloud 9

javascript - iframe 中 Bing map 中的多个位置

javascript - 将多个参数传递到 MongoDB 查询方法