108

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

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

4

8 に答える 8

151

関数は、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関数が新しく作成されたオブジェクトに割り当てられます。つまり、次のように使用します。

const obj = new Fizz();
obj.buzz();

またはより簡潔に ( を呼び出した後にオブジェクトを保持する必要がない場合buzz):

new Fizz().buzz();
于 2011-09-03T20:28:18.453 に答える
37

それは閉鎖と呼ばれます。

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

これは非常に強力な機能です。ここでより多くの説明を見ることができます:

Archive.org の javascript_closures_for_dummies.html ミラー

于 2011-09-03T20:30:25.340 に答える
14
function x() {}

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

var x = function() {}

私が間違っていない限り。

だから面白いことは何も起こっていない。

于 2011-09-03T20:24:08.883 に答える
10

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

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

foo自分の中で操作barします。bar外側のスコープで定義されていない限り、外側のスコープから触れることはできません。

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

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

bar(); // throws error: bar is not defined
于 2011-09-03T20:26:51.610 に答える
4

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

に存在するすべての変数dmyは に表示されますがpad2、その逆は起こりません:D

于 2011-09-03T20:28:42.690 に答える
3

関数内に関数を持つことは、JavaScript (および多くの言語) では完全に正常です。

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

于 2011-09-03T20:28:14.280 に答える
0

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

エラーをスローします。barは 内で定義されているため、 内でfooのみbarアクセスできますfoo
使用barするには、内部で実行する必要がありますfoo

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

于 2020-05-17T00:38:30.623 に答える