Вложенная функция JavaScript - PullRequest
       20

Вложенная функция JavaScript

87 голосов
/ 04 сентября 2011

Я получил кусок кода для javascript, который я просто не понимаю:

function dmy(d) {
    function pad2(n) {
        return (n < 10) ? '0' + n : n;
    }

    return pad2(d.getUTCDate()) + '/' +
       pad2(d.getUTCMonth() + 1) + '/' +
       d.getUTCFullYear();
}

function outerFunc(base) {
    var punc = "!";

    //inner function
    function returnString(ext) {
       return base + ext + punc;
    }

    return returnString;
}

Как можно определить функцию в другой функции?Можем ли мы вызвать pad2 () вне функции my ()?

Пожалуйста, осветите его.Спасибо

Ответы [ 6 ]

132 голосов
/ 04 сентября 2011

Функции - это еще один тип переменных в JavaScript (с некоторыми нюансами, конечно). Создание функции в другой функции изменяет область действия функции так же, как и область действия переменной. Это особенно важно для использования с замыканиями для уменьшения общего загрязнения пространства имен.

Функции, определенные в другой функции, не будут доступны вне функции, если они не были присоединены к объекту, который доступен вне функции:

function foo(doBar)
{
  function bar()
  {
    console.log( 'bar' );
  }

  function baz()
  {
    console.log( 'baz' );
  }

  window.baz = baz;
  if ( doBar ) bar();
}

В этом примере функция baz будет доступна для использования после запуска функции foo, так как она переопределена window.baz. Функция bar не будет доступна для любого контекста, кроме областей, содержащихся в функции foo.

как другой пример:

function Fizz(qux)
{
  this.buzz = function(){
    console.log( qux );
  };
}

Функция Fizz разработана как конструктор, поэтому при запуске она назначает функцию buzz для вновь созданного объекта.

32 голосов
/ 04 сентября 2011

Это называется замыкание .

По существу, функция, определенная в другой функции, доступна только внутри этой функции.Но может быть передан в результате, а затем этот результат может быть вызван.

Это очень мощная функция.Вы можете увидеть больше объяснений здесь:

javascript_closures_for_dummies.html mirror на Archive.org

13 голосов
/ 04 сентября 2011
function x() {}

эквивалентно (или очень похоже)

var x = function() {}

если я не ошибаюсь.

Так что ничего смешного не происходит.

9 голосов
/ 04 сентября 2011

Функция-экземпляр допускается внутри и снаружи функций.Внутри этих функций, подобно переменным, вложенные функции являются локальными и поэтому не могут быть получены из внешней области видимости.

function foo() {
    function bar() {
        return 1;
    }
    return bar();
}

foo манипулирует bar внутри себя.bar не может быть затронут из внешней области, если он не определен во внешней области.

Так что это не будет работать:

function foo() {
    function bar() {
        return 1;
    }
}

bar(); // throws error: bar is not defined
4 голосов
/ 04 сентября 2011

Когда вы объявляете функцию внутри функции, внутренние функции доступны только в той области, в которой они объявлены, или, в вашем случае, pad2 можно вызывать только в области dmy.

Все переменные, существующие в dmy, видны в pad2, но не происходит наоборот: D

3 голосов
/ 04 сентября 2011

Совершенно нормально в Javascript (и многих языках) иметь функции внутри функций.

Потратьте время на изучение языка, не используйте его на том основании, что оно похоже на то, что вы уже знаете.Я бы посоветовал посмотреть серию презентаций YUI Дугласа Крокфорда по Javascript, с особым акцентом на Акт III: Функция Ultimate (ссылка на скачивание видео, слайды и расшифровка)

...