var change8 = function()
{
console.log(a);
console.log("End of function");
a = 10;
}
change8();
返回参考错误
var change8 = function()
{
console.log(a);
console.log("End of function");
var a = 10;
}
change8();
返回未定义的
为什么第一个代码返回引用错误但是第二个代码返回undefined?
答案 0 :(得分:4)
Javascript执行称为提升的操作,在执行之前,它会查找Fragment
声明并创建这些变量。由于您在第二个中使用了var
,因此它会创建变量,但在使用时未定义。在第一个中,var a
在您创建它之前不存在,因此它是一个引用错误。
答案 1 :(得分:1)
它被称为variable hoisting
。在JS声明的变量实际上被提升(向上移动)到它们绑定的范围的顶部,所以在你的情况下它们被移动到你的函数的开头。在第二个示例中,a
被视为在任何分配之前实际在方法顶部声明,然后再分配给10
。因此,当您打印a
时,变量已定义但其值尚未分配。
var change8 = function()
{
var a;
console.log(a);
console.log("End of function");
a = 10;
}
但在第一个示例中,a未使用var
关键字定义,因此a
将被视为全局变量,并且在分配之前无法使用。因此,当在赋值之前调用它时,将发生错误。
要了解使用var
关键字声明变量,请检查以下answer
答案 2 :(得分:1)
var change8 = function()
{
console.log(a);
console.log("End of function");
a = 10;
}
change8();
自JavaScript only hoists declarations, not initializations以来,变量a
在全局上下文中被指定为未定义。考虑与 -
var a; // is = undefined
// in global context
var change8 = function()
{
console.log(a);
console.log("End of function");
a = 10;
}
change8();
因此,您将获得 - 未捕获的ReferenceError:a未定义
这不会发生在第二段代码中,因为您已使用var
明确声明了您的变量。阅读有关提升here的更多信息。
答案 3 :(得分:0)
这是因为,在第一个片段中你使用'a'在用var声明它之前,因此'a'属于全局范围,因此当你调用你的方法时会出现一个引用错误,因为'a'只会在执行第三行'a = 10'时的全局范围
在第二个'a'是未定义的,因为它在使用var声明之前被使用,虽然它仍然在函数的作用域中,当在运行时调用函数时,第一行'console.log( a)'不知道'a'