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


Я получил кусок кода для 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() из-за пределов моей функции ()?

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

6 76

6 ответов:

функции другой тип переменной в 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 не будет доступна ни для какого контекста, кроме областей, содержащихся в

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

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

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

javascript_closures_for_dummies.html зеркало ВКЛ Archive.org

function x() {}

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

var x = function() {}

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

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

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

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

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

так что это не сработает:

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

bar(); // throws error: bar is not defined

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

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

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

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