【问题标题】:javascript variable scope in function confusion函数混淆中的javascript变量范围
【发布时间】:2014-04-14 00:59:01
【问题描述】:

这里有 2 个 javascript 函数

var a = 10;
function abcd()
{
 alert(a);//alerts 10
 a=5;
}

另一个代码是这样的

var a = 10;
function abcd()
{
 alert(a);//alerts undefined
 var a=5;
}

在两个函数赋值/声明中都是在 alert() 调用之后。 那为什么alert message分别是10undefined呢?

【问题讨论】:

标签: javascript scope hoisting


【解决方案1】:

那是因为你的变量在你声明它时会被解释器得到"hoisted" up of its containing scope。所以你的代码最终会被这样解释:

function abcd()
{
 var a;
 alert(a); //alerts undefined
 a = 5;
}

为避免这种混淆,您可以遵循一些保持原状的做法,例如在开始时声明局部范围(即在函数范围内使用关键字 var 声明的变量)变量函数。

请注意,正如您从文章中看到的那样,嵌套函数也会发生这种情况。

【讨论】:

    【解决方案2】:

    在第一个代码 sn-p 中只有一个变量。函数外的a和函数内的a都指向全局变量。

    在第二个代码狙击手中有两个变量名为a,一个在函数外,一个在函数内。由于变量具有函数作用域,因此函数内部的局部变量存在于整个函数中,而不仅仅是在定义它的行之后。声明被提升到函数的顶部,而赋值仍然发生在它被写入的地方。

    【讨论】:

      【解决方案3】:

      我不完全确定这一点,但我想我可以告诉你原因:

      当解析第二个函数的源代码时,浏览器会知道在这个函数中将声明一个变量'a'。
      'var' 告诉它'a' 应该是函数范围内的一个新变量(不是全局变量)。 如果没有'var'(如第一个函数),它将使用已经在全局范围内声明的变量'a'。

      所以当它开始执行函数时,它会为它(以及即将在函数中声明的所有其他变量)分配内存。因为 'a' 仅在 'alert()' 函数访问 'a' 时已定义但尚未初始化,所以它返回 'undefined'。

      这里有一些棘手的范围主题:)

      【讨论】:

        猜你喜欢
        • 2014-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多