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