变量 testFun 为一个匿名函数,匿名函数返回的一个 testFun.init 对象(也是一个匿名函数)
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
先看一段简单的代码:
- 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 有任何关系。如: 所以,当赋于 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+'';})() 为了便于理解,可以把代码精简为: 只是 testFun() 没有返回一个 testFun.init 对象罢了。
来源: