Проблема языка JavaScript - PullRequest
       15

Проблема языка JavaScript

1 голос
/ 24 января 2011

Я получил ошибку 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 она должна найти aaa в функции foo2.

Но я получил ошибку.Почему?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 24 января 2011

Я думаю, что при запуске функции fn должна быть возможность найти aaa в функции foo2.

Нет, не должна.aaa объявлен в foo2 как локальная переменная, он не доступен внутри fn.Что заставляет вас думать иначе?Ни один из языков программирования, который я видел, не будет вести себя так.

Это сработает, если вы раскомментируете строку //var aaa = 'AAA';, но тогда предупреждение внутри fn, конечно, скажет "AAA", а не "BBB".

2 голосов
/ 24 января 2011

Это не работает, потому что aaa выходит за рамки fn(). Что может вас смущать, так это

(function () {
  alert(aaa); // 'BBB'
})();

работает, но fn() нет. Происходит то, что, поскольку «BBB» определено, и , вызываемые внутри foo2, alert(aaa) и aaa, находятся в одной области видимости, и это прекрасно работает.

Учитывая это, у вас есть два варианта:

  1. Объявите aaa в верхней области:

    var aaa = 'BBB';
    
    var fn = function () {
      return function () {
        alert(aaa);
      };
    };
    
    var foo2 = function () {
        (function () {
            alert(aaa); // 'BBB'
        })();
        fn();
    };
    
  2. Передать aaa в качестве параметра fn():

    var fn = function (aaa) {
      return function () {
        alert(aaa);
      };
    };
    
    var foo2 = function () {
        var aaa = 'BBB';
        (function () {
            alert(aaa); // 'BBB'
        })();
        fn(aaa);
    };
    

Вот статья о javascript scoping:

http://www.digital -web.com / статьи / scope_in_javascript /

Надеюсь, это поможет.

1 голос
/ 24 января 2011

Вы объявили var aaa в пределах foo2, поэтому область его действия ограничена foo2. fn не имеет к нему доступа.

Либо объявите var aaa вне обеих функций, либо передайте его fn в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...