JavaScript嵌套函数

时间:2011-09-03 20:16:03

标签: javascript nested-function

我有一段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 个答案:

答案 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)

它被称为关闭

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

这是一个非常强大的功能。你可以在这里看到更多解释:

javascript_closures_for_dummies.html mirror on Archive.org

答案 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"
}