У меня есть фрагмент кода для 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 () извне моей функции ()?
Пожалуйста, осветите это. Спасибо
Ответы:
Функции - это еще один тип переменных в JavaScript (конечно, с некоторыми нюансами). Создание функции внутри другой функции изменяет область действия функции так же, как изменяет область действия переменной. Это особенно важно для использования с замыканиями, чтобы уменьшить общее загрязнение глобального пространства имен.
Функции, определенные в другой функции, не будут доступны вне функции, если они не были прикреплены к объекту, доступному за пределами функции:
В этом примере функция baz будет доступна для использования после того, как
foo
функция будет запущена, поскольку она переопределенаwindow.baz
. Функция панели не будет доступна для любого контекста, кроме областей, содержащихся вfoo
функции.в качестве другого примера:
Fizz
Функция предназначена как конструктор , так что при запуске он назначаетbuzz
функцию для вновь созданного объекта.источник
Это называется закрытием .
По сути, функция, определенная в другой функции, доступна только в этой функции. Но может быть передан в результате и тогда этот результат может быть вызван.
Это очень мощная функция. Вы можете увидеть больше объяснений здесь:
javascript_closures_for_dummies.html зеркало на Archive.org
источник
эквивалентно (или очень похоже) на
если я не ошибаюсь.
Так что ничего смешного не происходит.
источник
Создание экземпляров функций разрешено внутри и вне функций. Внутри этих функций, как и в переменных, вложенные функции являются локальными и поэтому не могут быть получены извне.
foo
манипулируетbar
внутри себя.bar
нельзя касаться из внешней области, если она не определена во внешней области.Так что это не сработает:
источник
Когда вы объявляете функцию внутри функции, внутренние функции доступны только в той области, в которой они объявлены, или, в вашем случае,
pad2
могут быть вызваны только вdmy
области.Все переменные, существующие в
dmy
, видны вpad2
, но не бывает наоборот: Dисточник
В Javascript (и во многих языках) совершенно нормально иметь функции внутри функций.
Найдите время, чтобы выучить язык, не используйте его на том основании, что он похож на то, что вы уже знаете. Я бы посоветовал посмотреть серию презентаций YUI на Javascript Дугласа Крокфорда с особым акцентом на Act III: Function the Ultimate (ссылка на загрузку видео, слайды и стенограмму)
источник
Выдает ошибку. Поскольку
bar
определено внутриfoo
,bar
будет доступно только внутриfoo
.Для использования
bar
нужно запустить его внутрьfoo
.источник