先看一段简单的代码:
复制代码 代码如下:
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对象罢了。