JavaScript范围的变量

时间:2017-02-26 19:48:15

标签: javascript scope

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?

4 个答案:

答案 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'