私は理解していない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()を呼び出すことはできますか?
光を当ててください。ありがとう
関数は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
関数が新しく作成されたオブジェクトに割り当てられます。
これはclosureと呼ばれます。
基本的に、他の関数内で定義された関数は、この関数内でのみアクセス可能です。しかし、結果として渡され、この結果が呼び出される場合があります。
これは非常に強力な機能です。詳細については、こちらをご覧ください。
function x() {}
と同等(または非常に類似)
var x = function() {}
誤解しない限り。
だから面白いことは何も起きていません。
関数のインスタンス化は関数の内外で許可されます。これらの関数内では、変数と同様に、ネストされた関数はローカルであるため、外部スコープから取得することはできません。
function foo() {
function bar() {
return 1;
}
return bar();
}
foo
は、その内部でbar
を操作します。 bar
は、外部スコープで定義されていない限り、外部スコープから変更できません。
したがって、これは機能しません:
function foo() {
function bar() {
return 1;
}
}
bar(); // throws error: bar is not defined
関数内で関数を宣言する場合、内部関数は宣言されたスコープでのみ使用できます。または、あなたの場合、pad2
はdmy
スコープでのみ呼び出すことができます。
dmy
に存在するすべての変数はpad2
に表示されますが、他の方法では発生しません:D
Javascript(および多くの言語)では、関数内に関数を含めることは完全に正常です。
時間をかけて言語を学んでください。既に知っている言語に似ているという理由で使用しないでください。 Act III:Function the Ultimate (ビデオのダウンロード、スライド、およびトランスクリプトへのリンク)に特に重点を置いて、Javascriptに関するDouglas Crockfordの一連のYUIプレゼンテーションをご覧になることをお勧めします