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()吗?

请把灯打开,谢谢

254434 次浏览
function x() {}

is equivalent (or very similar) to

var x = function() {}

除非我弄错了。

So there is nothing funny going on.

允许在函数内部和外部实例化函数。在这些函数内部,就像变量一样,嵌套的函数是局部的,因此不能从外部作用域获得。

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

foo在自己内部操纵 bar。除非在外部作用域中定义,否则不能从外部作用域触及 bar

So this will not work:

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


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

在 JavaScript (以及许多语言)中,函数内部包含函数是非常正常的。

花时间学习这门语言,不要以它与你已经知道的相似为基础。我建议观看道格拉斯·克罗克福特用 JavaScript 做的一系列 YUI 演示,特别关注 第三部分: 发挥终极作用(链接到视频下载、幻灯片和文字记录)

函数是 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 函数只能用于包含在 foo函数中的作用域之外的任何上下文。

作为一个不同的例子:

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

The Fizz function is designed as a constructor so that, when run, it assigns a buzz function to the newly created object. That is, you'd use it like this:

const obj = new Fizz();
obj.buzz();

or more concisely (if you don't need to keep the object after calling buzz):

new Fizz().buzz();

当您在函数中声明一个函数时,内部函数只能在声明它们的作用域中可用,或者在您的情况下,pad2只能在 dmy作用域中调用。

所有存在于 dmy中的变量在 pad2中都是可见的,但是它不会反过来发生: D

它叫做 了结

基本上,在其他函数中定义的函数只能在这个函数中访问。但是可以作为结果传递,然后这个结果可以被调用。

这是一个非常强大的特性,你可以在这里看到更多的解释:

javascript_closures_for_dummies.html mirror on Archive.org

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

将抛出一个错误。 因为 bar是在 foo内部定义的,所以 bar只能在 foo内部访问。
要使用 bar,您需要在 foo内部运行它。 < br > < br >
function foo() {
function bar() {
return 1;
}
bar();
}

嵌套函数可以作为编写模块化相关函数组的基础,有点像完全面向对象程序设计(仅限于静态类)。

下面是这样一组函数的示例,在本例中将值转换为 JSON 字符串,或将 JSON 字符串转换为值。

Notice how the inner functions are grouped into an Object inside an outer function, and how the Object is then stored into a group name. This is the only name directly visible from outside the group. To reach any contained function from outside, you just write the group name, a period, then the function name. To reach a contained function from inside, you can use the same notation, or 'this', a period, then the function name.

//--------------------------------------------------------------------//
//      Module J:
//          Convert from and to JSON strings
//--------------------------------------------------------------------//
const J=NewJ();
function NewJ()
{
const mod=
{
From:(str)=>
{
return JSON.parse(str);
}, // From
To:(val)=>
{
return JSON.stringify(val,null,3);
} // To
}; // mod
return mod;
} // NewJ


//--------------------------------------------------------------------//
//      End Module J
//--------------------------------------------------------------------//

Here's a test:

console.log(J.To({A:'a'}));

控制台输出:

{
"A": "a"
}