2011-09-03 99 views
64

我得到了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; 
} 

怎么能功能的其他函数中定义?我们可以从my()函数之外调用pad2()吗?

请说明一下。除非我错了感谢

+8

功能可以在函数中被创建。这是完全有效的。 – 0x499602D2

回答

109

函数是JavaScript中的另一种类型的变量(当然有一些细微差别)。在另一个函数内创建一个函数会改变函数的作用域,就像改变一个变量的作用域一样。这对于使用闭包来减少总体全局名称空间污染尤为重要。除非它们已经连接到一个对象,它是函数外部接近

另一个功能中定义的功能将不会是函数外部接近:

function foo(doBar) 
{ 
    function bar() 
    { 
    console.log('bar'); 
    } 

    function baz() 
    { 
    console.log('baz'); 
    } 

    window.baz = baz; 
    if (doBar) bar(); 
} 

在这个例子中,功能巴兹将可用在foo函数运行后使用,因为它被覆盖window.baz。除了foo函数中包含的示波器以外,任何其他上下文都不能使用该条形函数。

作为不同的例子:

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

Fizz功能被设计成一个构造函数,以便在运行时,它分配一个buzz函数到新创建的对象。

+0

什么是window.baz = baz?为什么这条线路可用? –

+0

@ZiyangZhang,后段代码块有解释,有没有一个特定的部分不清楚? – zzzzBov

+0

速度和记忆效率都很低..请参阅下面的答案 – kofifus

12
function x() {} 

等于(或非常相似)

var x = function() {} 

所以没有什么好笑的事情发生。

+5

第一种语法将被移至文档的开头。 所以有可能在函数初始化之前调用函数'x'。 – Tom

+5

第一个语法也会给你带来命名函数更好的栈跟踪,第二个语法会给你头痛 – TheZ

7

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

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

foo操纵bar内本身。 bar除非在外部范围内定义,否则不能从外部范围触及。

所以这是行不通的:

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

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

这是在Javascript(和许多语言)完全正常的有内部函数的函数。

花时间学习语言,不要在与已知类似的基础上使用它。我建议观看道格拉斯克罗克福德关于Javascript的YUI系列演讲,特别关注Act III: Function the Ultimate(链接到视频下载,幻灯片和成绩单)

4

当您在一个函数中声明一个函数时,内部函数仅在声明范围内可用,或者在您的情况下,只能在dmy范围内调用pad2

所有现有dmy的变量是pad2可见,但它并没有发生周围的其他方式:d