Подтвердить что ты не робот

Вложенная функция 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() вне функции my()?

Просветите его. Благодаря

4b9b3361

Ответ 1

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

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

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

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

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

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

в качестве другого примера:

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

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

Ответ 2

Он называется закрытием.

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

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

javascript_closures_for_dummies.html зеркало на Archive.org

Ответ 3

function x() {}

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

var x = function() {}

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

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

Ответ 4

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

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

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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