まず簡単なコードを見てみましょう:
var testFun=function ( name,age){
var job='Flash Develop';
return new testFun.init(name,age,job);
testFun.init= function(name,age,job) ){
return 'name:' 名前 ',age:' 年齢 ',job:' 仕事 '';
}
alert(testFun('vincent',30 )); //[object Object ]
変数 testFun は非常に単純で、匿名関数は testFun.init オブジェクト (これも匿名関数) を返します。しかし、一部の初心者は、testFun が返される testFun.init オブジェクトであると誤解することがあります。彼は、匿名関数関数 (名前、年齢) の構築プロセス中に testFun が再び使用されたと考えているかもしれません。現時点では、testFun はまだ構築中であり、まだ存在していないはずです。
実際、この考え方には誤解があります。testFun が testFun() オブジェクトである場合、コードは testFun=function である必要があります。 (名前、年齢) {… …}()。正しく理解すると、testFun は単なる関数です。関数を代入した時点では、その関数が未定義または null を返したとしても、それ自体は testFun() が実行された後でのみ関数になります。値が未定義または null です。戻り値は testFun() の実行結果です。結果が返された後は、testFun とは何の関係もありません。例:
var testFun=function() {
戻り値
}
var result=testFun();
alert(testFun); // 関数 () {return 未定義;}
alert(result);結果は testFun と異なります もう関係はありません
したがって、匿名関数が testFun に割り当てられると、別の値が割り当てられるまで、その関数は常に存在します。 testFun.init は次のように簡単に理解できます:
testFun.init=function(name,age){}.init=function(name,age.job){… …}
まとめると、振り返ってみると、 testFun は関数であり、testFun() は (function(name,age,job){return 'name:' name ',age:' age ',job:' job ''; })()
の順です理解を容易にするために、コードは次のように簡略化できます。
var testFun=function(){}
testFun.init=function(){}
testFun() が testFun.init オブジェクトを返さないだけです。