先看一段簡單的代碼:
復制代碼 代碼如下:
var testFun=function (name,age){
var job='Flash Develop';
return new testFun.init(name,age,job);
}
testFun.init=function(name,age,job){
return 'name:'+name+',age:'+age+',job:'+job+'';
}
alert(testFun('vincent',30)); //[object Object]
代碼很簡單,變量testFun為一個匿名函數,匿名函數返回的一個testFun.init對象(也是一個匿名函數)。但對於一些新手有時會誤解為:testFun是返回的一個testFun.init對象。他可能會這樣想,在匿名函數function(name,age)構建過程中,又用到了testFun. 此時testFun還在構建中,應該還沒有存在,testFun.init更沒有存在,怎麼就可以用testFun.init呢?
其實這樣想是存在了一個誤區:把testFun與testFun()等同起來了,如果testFun是返回的一個testFun.init對象,代碼應該是testFun=function(name,age){… …}()。正確的理解應該是這樣的,testFun只是一個函數,當你把一個函數賦於它時,它就已經存在了,哪怕函數返回的是undefined或null,它本身仍然是Function,只有testFun()執行後返回值才是undefined或null。返回值是testFun()執行的結果,結果返回後,就不再與testFun有任何關系。如:
復制代碼 代碼如下:
var testFun=function(){
return undefined;
}
var result=testFun();
alert(testFun); // function () {return undefined;}
alert(result); // undefined 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對象罷了。