Uncaught ReferenceError和undefined有什么区别?

时间:2016-03-04 15:06:15

标签: javascript

在以下代码中,有两个“undefined”实例:

A:

b();
console.log(a);

var a = "Hello World!";

function b() {
 console.log("Called b!");    
}

这会导致控制台为“a”显示“Undefined”。

B:

b();
console.log(a);

function b() {
 console.log("Called b!");    
}

这会创建“未捕获的ReferenceError:a未定义”。在这两种情况下,a都是未定义的,控制台会告诉您。但是,为什么它会根据具体情况选择不同的方式呢?除了undefined和null之外还有几种形式的“undefined”吗?

2 个答案:

答案 0 :(得分:8)

由于hoisting,第一个代码被视为如下。

var a; // Declare the variable

// Move function definitions to the top
function b() {
    console.log("Called b!");
}
b();
console.log(a); // Undefined, no value assigned yet

a = "Hello World!";

console.log(a); // Hello World!

在第二个代码a中永远不会定义。并且尝试访问这些变量将导致抛出ReferenceError。

这里有一个blog来阅读有关吊装的更多信息。

简单的规则是:

  1. 如果声明变量且未分配任何值,则undefined
  2. 如果未定义变量/函数并尝试使用它将抛出参考错误

答案 1 :(得分:4)

关于hoisting

基本上你的A块被Javascript解释为:

// Variable is declared, but without a value (undefined)
var a;

b();
console.log(a);

a = "Hello World!";

function b() {
  console.log("Called b!");    
}

这就是你在第二种情况下得到错误的原因:变量a没有在任何地方定义。

相关问题