web-dev-qa-db-ja.com

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()を呼び出すことはできますか?

光を当ててください。ありがとう

87
Thomas

関数はJavaScriptの別のタイプの変数です(もちろん微妙な違いもあります)。別の関数内に関数を作成すると、変数のスコープを変更するのと同じ方法で関数のスコープが変更されます。これは、クロージャーで使用して、グローバルな名前空間全体の汚染を減らすために特に重要です。

別の関数内で定義された関数は、関数の外部からアクセス可能なオブジェクトにアタッチされていない限り、関数の外部からアクセスできません。

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

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

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

この例では、foo関数が実行された後、window.bazがオーバーライドされるため、baz関数は使用可能になります。 bar関数は、foo関数内に含まれるスコープ以外のコンテキストでは使用できません。

別の例として:

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

Fizz関数はコンストラクターとして設計されているため、実行時に、buzz関数が新しく作成されたオブジェクトに割り当てられます。

134
zzzzBov

これはclosureと呼ばれます。

基本的に、他の関数内で定義された関数は、この関数内でのみアクセス可能です。しかし、結果として渡され、この結果が呼び出される場合があります。

これは非常に強力な機能です。詳細については、こちらをご覧ください。

Archive.orgのjavascript_closures_for_dummies.htmlミラー

32
Tadeck
function x() {}

と同等(または非常に類似)

var x = function() {}

誤解しない限り。

だから面白いことは何も起きていません。

13
Andreas

関数のインスタンス化は関数の内外で許可されます。これらの関数内では、変数と同様に、ネストされた関数はローカルであるため、外部スコープから取得することはできません。

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

fooは、その内部でbarを操作します。 barは、外部スコープで定義されていない限り、外部スコープから変更できません。

したがって、これは機能しません:

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

bar(); // throws error: bar is not defined
9
0x499602D2

関数内で関数を宣言する場合、内部関数は宣言されたスコープでのみ使用できます。または、あなたの場合、pad2dmyスコープでのみ呼び出すことができます。

dmyに存在するすべての変数はpad2に表示されますが、他の方法では発生しません:D

4
pedrochaves

Javascript(および多くの言語)では、関数内に関数を含めることは完全に正常です。

時間をかけて言語を学んでください。既に知っている言語に似ているという理由で使用しないでください。 Act III:Function the Ultimate (ビデオのダウンロード、スライド、およびトランスクリプトへのリンク)に特に重点を置いて、Javascriptに関するDouglas Crockfordの一連のYUIプレゼンテーションをご覧になることをお勧めします

3