-4
<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。这个程序是如何工作的。

4

4 回答 4

4

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

于 2012-09-24T18:43:24.093 回答
3

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

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

在函数内创建局部变量/函数的位置无关紧要,它仍然会在函数中的代码开始之前创建,所以这样做:

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

基本上是一样的:

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

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

由于函数中的代码仅更改局部变量a,因此全局变量a不变。

于 2012-09-24T18:46:24.787 回答
1

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

于 2012-09-24T18:42:58.503 回答
0

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

于 2012-09-24T18:43:07.470 回答