JavaScript语言问题

JavaScript语言问题,javascript,scope,Javascript,Scope,我在运行以下代码时遇到JavaScript错误: <!DOCTYPE html> <meta charset="utf-8"> <title>Untitled Document</title> <script> var fn = function () { //var aaa = 'AAA'; return function () { alert(aaa);

我在运行以下代码时遇到JavaScript错误:

<!DOCTYPE html>
<meta charset="utf-8">
<title>Untitled Document</title>
<script>
    var fn = function () {
        //var aaa = 'AAA';
        return function () {
            alert(aaa);
        };
    }();

    var foo2 = function () {
        var aaa = 'BBB';
        (function () {
            alert(aaa); // 'BBB'
        })();
        fn(); // Error: Uncaught ReferenceError: aaa is not defined
    }();
</script>
我认为当fn函数运行时,应该能够在foo2函数中找到aaa

但我犯了个错误。为什么?

谢谢大家!

我认为当fn函数运行时,应该能够在foo2函数中找到aaa

不,不应该。aaa在foo2中声明为局部变量,在fn中不可访问。你怎么会不这么想?我所见过的任何编程语言都不会有这样的行为

如果您取消注释行//var aaa='aaa',它将起作用;但是fn内部的警报当然会说AAA而不是BBB

我认为当fn函数运行时,应该能够在foo2函数中找到aaa

不,不应该。aaa在foo2中声明为局部变量,在fn中不可访问。你怎么会不这么想?我所见过的任何编程语言都不会有这样的行为

如果您取消注释行//var aaa='aaa',它将起作用;但是fn内部的警报当然会显示AAA而不是BBB。

您在foo2中声明了var AAA,因此其范围仅限于foo2。fn无法访问它

要么在两个函数之外声明var aaa,要么将其作为参数传递给fn。

您在foo2中声明了var aaa,因此其范围仅限于foo2。fn无法访问它

要么在两个函数之外声明var aaa,要么将其作为参数传递给fn。

它不起作用,因为aaa超出了fn的范围。让你困惑的是

(function () {
  alert(aaa); // 'BBB'
})();
正在工作,但fn没有。现在的情况是,由于BBB是在foo2内部定义和调用的,所以alertaaa和aaa在同一个范围内,并且工作正常

因此,您有两种选择:

在更高范围内声明aaa:

var aaa = 'BBB';

var fn = function () {
  return function () {
    alert(aaa);
  };
};

var foo2 = function () {
    (function () {
        alert(aaa); // 'BBB'
    })();
    fn();
};
将aaa作为参数传递给fn:

下面是一篇关于javascript作用域的文章:

我希望这能有所帮助。

它不起作用,因为aaa超出了fn的范围。让你困惑的是

(function () {
  alert(aaa); // 'BBB'
})();
正在工作,但fn没有。现在的情况是,由于BBB是在foo2内部定义和调用的,所以alertaaa和aaa在同一个范围内,并且工作正常

因此,您有两种选择:

在更高范围内声明aaa:

var aaa = 'BBB';

var fn = function () {
  return function () {
    alert(aaa);
  };
};

var foo2 = function () {
    (function () {
        alert(aaa); // 'BBB'
    })();
    fn();
};
将aaa作为参数传递给fn:

下面是一篇关于javascript作用域的文章:

我希望这有帮助