【问题标题】:Scoping in javascript [closed]javascript中的范围[关闭]
【发布时间】:2012-09-24 18:40:01
【问题描述】:
<html>
  <head>
    <title></title>
  <script type="text/javascript">  
    var a = 1;
function b() {
    a = 10;
    return;
    function a() {}
}

</script>
  </head>
  <body>
<script type="text/javascript">
b();
alert(a);
</script>
  </body>
</html>

我来自 c 和 java 背景。作用域规则在 java 脚本中是不同的。我想知道为什么这个程序给出输出 1。这个程序是如何工作的。

【问题讨论】:

标签: javascript global-variables local-variables scoping


【解决方案1】:

JavaScript 使用函数作用域。此外,函数被“提升”到其作用域的顶部(最近的函数)。

function b() {
    a = 10;
    return;
    function a() {}
}

这被解释为:

function b() {
    function a() {}  // function was hoisted
    a = 10;
    return;
}

当使用function a(){} 声明函数时,就好像那里有一个var;它正在制作一个局部变量。因此,a=10 是本地的a,而不是全局的a

参考:http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

【讨论】:

  • 也可以在b()中表示为var a=function(){};
【解决方案2】:

这里发生了两件事;变量的作用域,以及函数和变量在函数内部的声明方式。

您在名为ab 函数内部声明了一个局部函数,因此这与在函数内部声明一个局部变量的效果相同,该局部变量在全局范围内以相同的名称隐藏变量。

无论你在函数内部的何处创建局部变量/函数,它仍然会在函数中的代码开始之前创建,所以这样做:

function b() {
  a = 10;
  return;
  function a() {}
}

基本相同:

function b() {
  var a = function(){};
  a = 10;
  return;
}

当函数中的代码将值10赋给变量a时,它实际上覆盖了本地函数,并用数字代替了它。由于 Javascript 中的函数引用是一等成员,它们可以像任何其他值一样被传递,也可以被任何其他值替换。

由于函数中的代码只改变了局部变量a,所以全局变量a没有改变。

【讨论】:

    【解决方案3】:

    在 javascript 中,作用域单元是一个函数。在您的 b 函数中,a 是一个本地函数。因此,全局a 变量不受影响。

    【讨论】:

      【解决方案4】:

      关于 Javascript 语言的作用域,你可以在这里找到:http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

      【讨论】:

        猜你喜欢
        • 2010-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-26
        • 2016-03-07
        • 2012-02-27
        相关资源
        最近更新 更多