我有一段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;
}
如何在另一个函数中定义函数?我们可以从my()函数外部调用pad2()吗?
请注意一下。感谢
答案 0 :(得分:131)
函数是JavaScript中的另一种变量(当然还有一些细微差别)。在另一个函数中创建函数会改变函数的范围,就像更改变量范围一样。这对于使用闭包来减少全局命名空间污染总是特别重要。
在函数外部定义的函数将无法在函数外部访问,除非它们已附加到函数外部可访问的对象:
function foo(doBar)
{
function bar()
{
console.log( 'bar' );
}
function baz()
{
console.log( 'baz' );
}
window.baz = baz;
if ( doBar ) bar();
}
在此示例中,运行foo
函数后可以使用baz函数,因为它被覆盖window.baz
。除了foo
函数中包含的范围之外,bar函数将不可用于任何上下文。
作为一个不同的例子:
function Fizz(qux)
{
this.buzz = function(){
console.log( qux );
};
}
Fizz
函数被设计为构造函数,以便在运行时为新创建的对象分配buzz
函数。
答案 1 :(得分:31)
它被称为关闭。
基本上,其他函数中定义的函数只能在此函数中访问。但是可以作为结果传递,然后可以调用此结果。
这是一个非常强大的功能。你可以在这里看到更多解释:
答案 2 :(得分:13)
function x() {}
等同于(或非常相似)
var x = function() {}
除非我弄错了。
所以没有什么可笑的。
答案 3 :(得分:9)
允许在函数内部和外部使用函数实例化。在这些函数中,就像变量一样,嵌套函数是局部的,因此不能从外部范围获得。
function foo() {
function bar() {
return 1;
}
return bar();
}
foo
在其内部操纵bar
。除非在外部范围中定义,否则无法从外部范围触及bar
。
所以这不起作用:
function foo() {
function bar() {
return 1;
}
}
bar(); // throws error: bar is not defined
答案 4 :(得分:4)
在函数中声明函数时,内部函数仅在声明它们的作用域中可用,或者在您的情况下,pad2
只能在dmy
作用域中调用
dmy
中存在pad2
中存在的所有变量,但不会发生相反的情况:D
答案 5 :(得分:3)
在Javascript(和许多语言)中,在函数内部使用函数是完全正常的。
花点时间学习语言,不要在它与你已经知道的相似的基础上使用它。我建议观看道格拉斯·克罗克福德关于Javascript的YUI系列演讲,特别关注Act III: Function the Ultimate(链接到视频下载,幻灯片和成绩单)
答案 6 :(得分:0)
function foo() {
function bar() {
return 1;
}
}
bar();
bar
是在foo
中定义的,因此bar
仅可在foo
内部访问。bar
,您需要在foo
内部运行它。 function foo() {
function bar() {
return 1;
}
bar();
}
答案 7 :(得分:0)
嵌套函数可以作为编写一组模块化相关函数的基础,有点像完整的面向对象编程(仅限静态类)。
这里是这样一组函数的示例,在本例中用于将值转换为 JSON 字符串或将 JSON 字符串转换为值。
注意内部函数如何分组到外部函数内的对象中,以及对象是如何存储到组名中的。这是从组外直接可见的唯一名称。要从外部访问任何包含的函数,您只需编写组名、句点,然后是函数名。要从内部访问包含的函数,您可以使用相同的符号,或“this”、句点,然后是函数名称。
//--------------------------------------------------------------------//
// 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
//--------------------------------------------------------------------//
这是一个测试:
console.log(J.To({A:'a'}));
控制台输出:
{
"A": "a"
}