JavaScript 嵌套函数

IT技术 javascript nested-function
2021-01-25 12:59:07

我得到了一段我不明白的 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() 吗?

请给它点灯。谢谢

6个回答

函数是 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 );
  };
}

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

每次调用“foo”时,JavaScript 是否都必须重新创建“bar”和“baz”?
2021-03-28 12:59:07
@ZiyangZhang,那个代码块后面的一段有说明,有没有说不清楚的地方?
2021-03-29 12:59:07
也许这取决于“严格”会做不同的事情?
2021-04-03 12:59:07
window.baz = baz 是什么?为什么这条线 m?ke baz 可用?
2021-04-04 12:59:07

它被称为闭包

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

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

Archive.org 上的 javascript_closures_for_dummies.html 镜像

function x() {}

相当于(或非常相似)

var x = function() {}

除非我弄错了。

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

很多有趣的事情正在发生。内部函数中使用的任何变量都被捕获为快照。我认为。并且可能还捕获了引用的全局变量。
2021-03-14 12:59:07
第一种语法还可以通过命名函数为您提供更好的堆栈跟踪,第二个会让您头疼
2021-03-15 12:59:07
第一个语法将移动到文档的开头。因此可以在函数初始化之前调用函数“x”。
2021-03-21 12:59:07
@jinglesthula 是的!Chrome 不久前添加了此名称推断,非常感谢 :)
2021-03-28 12:59:07
@TheZ 我认为 Chrome 最近在调试中添加了函数名称推断,因此在常见情况下您不会像以前一样头疼。
2021-03-31 12:59:07

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

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

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

所以这行不通:

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

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

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

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