Вложенные функции 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 ответов:
функции другой тип переменной в 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: функция конечная (ссылка на скачивание видео, слайды и расшифровка)