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