JavaScript嵌套函数

Tho*_*mas 91 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;
}
Run Code Online (Sandbox Code Playgroud)

如何在另一个函数中定义函数?我们可以从my()函数外部调用pad2()吗?

请点亮一下.谢谢

zzz*_*Bov 136

函数是JavaScript中的另一种变量(当然还有一些细微差别).在另一个函数中创建函数会改变函数的范围,就像更改变量范围一样.这对于使用闭包来减少总体全局命名空间污染尤为重要.

在函数外部定义的函数将无法在函数外部访问,除非它们已附加到函数外部可访问的对象:

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

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

  window.baz = baz;
  if ( doBar ) bar();
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,baz函数将在foo函数运行后可用,因为它已被覆盖window.baz.除了函数中包​​含的范围之外,bar函数将不可用于任何上下文foo.

作为一个不同的例子:

function Fizz(qux)
{
  this.buzz = function(){
    console.log( qux );
  };
}
Run Code Online (Sandbox Code Playgroud)

Fizz函数被设计为构造函数,以便在运行时为buzz新创建的对象分配函数.


Tad*_*eck 32

它被称为封闭.

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

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

Archive.org上的javascript_closures_for_dummies.html镜像


And*_*eas 13

function x() {}
Run Code Online (Sandbox Code Playgroud)

等同于(或非常相似)

var x = function() {}
Run Code Online (Sandbox Code Playgroud)

除非我弄错了.

所以没有什么好玩的.

  • 第一种语法也会让你获得更好的堆栈跟踪和命名函数,第二种语法会让你头疼 (9认同)
  • 第一个语法将移动到文档的开头.因此可以在初始化函数之前调用函数'x'. (8认同)

0x4*_*2D2 9

函数内部和外部允许函数实例化.在这些函数中,就像变量一样,嵌套函数是局部函数,因此无法从外部作用域获取.

function foo() {
    function bar() {
        return 1;
    }
    return bar();
}
Run Code Online (Sandbox Code Playgroud)

foobar在自己内部操纵.bar除非在外部范围内定义,否则不能从外部范围触及.

所以这不起作用:

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

bar(); // throws error: bar is not defined
Run Code Online (Sandbox Code Playgroud)