js当一个变量为函数时 应该注意的一点细节小结


Posted in Javascript onDecember 29, 2011

先看一段简单的代码:

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对象罢了。
Javascript 相关文章推荐
Hutia 的 JS 代码集
Oct 24 Javascript
『jQuery』取指定url格式及分割函数应用
Apr 22 Javascript
javascript的渐进增强与平稳退化浅谈
Nov 12 Javascript
Js与Jq 获取页面元素值的方法和差异对比
Apr 30 Javascript
Jquery使用css方法改变样式实例
May 18 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
Aug 04 Javascript
Angularjs 实现一个幻灯片示例代码
Sep 08 Javascript
详解基于angular-cli配置代理解决跨域请求问题
Jul 05 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
Jul 27 Javascript
ES6的Fetch异步请求的实现方法
Dec 07 Javascript
JavaScript Window浏览器对象模型原理解析
May 30 Javascript
JS实现扫雷项目总结
May 19 Javascript
为JavaScript类型增加方法的实现代码(增加功能)
Dec 29 #Javascript
javaScript 利用闭包模拟对象的私有属性
Dec 29 #Javascript
Jquery中删除元素的实现代码
Dec 29 #Javascript
js的表单操作 简单计算器
Dec 29 #Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
Dec 29 #Javascript
JavaScript中两个感叹号的作用说明
Dec 28 #Javascript
javascript (用setTimeout而非setInterval)
Dec 28 #Javascript
You might like
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
thinkPHP通用控制器实现方法示例
2017/11/23 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
类似CSDN图片切换效果脚本
2009/09/17 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
layui框架中layer父子页面交互的方法分析
2017/11/15 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
javascript显示动态时间的方法汇总
2018/07/06 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
2018/10/15 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
解决ant Design中this.props.form.validateFields未执行的问题
2020/10/27 Javascript
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
python通过字典dict判断指定键值是否存在的方法
2015/03/21 Python
python difflib模块示例讲解
2017/09/13 Python
Python编程产生非均匀随机数的几种方法代码分享
2017/12/13 Python
Python中请不要再用re.compile了
2019/06/30 Python
使用OpenCV实现仿射变换—旋转功能
2019/08/29 Python
Django 解决distinct无法去除重复数据的问题
2020/05/20 Python
贝佳斯官方网站:Borghese
2020/05/08 全球购物
TCP/IP中的TCP和IP分别承担什么责任
2012/04/21 面试题
2014新年元旦活动策划方案
2014/02/18 职场文书
服装采购员岗位职责
2014/03/15 职场文书
销售团队获奖感言
2014/08/14 职场文书
小学少先队辅导员述职报告
2015/01/10 职场文书
水电施工员岗位职责
2015/04/11 职场文书
台风停课通知
2015/04/24 职场文书
单位政审意见范文
2015/06/04 职场文书
追讨欠款律师函
2015/06/24 职场文书
2016年公司新年寄语
2015/08/17 职场文书
浅谈如何写好演讲稿?
2019/06/12 职场文书