通过javascript的匿名函数来分析几段简单有趣的代码


Posted in Javascript onJune 29, 2010

1、简单形式的封装调用

var userName = function() { return "jeff wong" } (); 
alert(userName);

上面的代码确实简单,我们可以逐步分解成下面的写法:

var anonymousFunc = function() { return "jeff wong" }; //匿名函数 
var name = anonymousFunc(); //执行该函数 返回人名 
alert(name);

2、new 一下Function的形式(大写Function)
var a = new Object(); 
var b = new Function(); 
//alert(typeof (a)); //object 
//alert(typeof (b)); //function 
alert(a); //[object Object] 
alert(b); //匿名函数 
//alert(a == b); //false 
//alert(a === b); //false

正如你所看到的那样,我们new一个Object,变量a弹出的是[object Object],而new一个Function(注意,是大写Function),b在弹出的时候,生成了匿名函数。 既然b是匿名函数,函数当然可以执行,我们可以继续试试下面的代码验证自己的猜测:

alert(b()); //undefined 
alert(a()); //脚本错误 提示“缺少函数”

3、new 一下function也大有乾坤(小写function)
(1)、简单的空函数

var func = new function() { }; 
alert(typeof (func)); //object 
alert(func); //[object Object] 
//alert(func()); //脚本错误 func不是函数

其实上面的代码也就等价于下面的写法:

function anonymousClass() { } //匿名类 
var instance = new anonymousClass(); 
alert(typeof (instance));//object 
alert(instance); //[object Object] [code] 
(2)、函数带个返回值的,也不是很难理解 
[code] 
var func = new function() { return "jeff wong" }; 
alert(typeof (func)); 
alert(func); 
//alert(func()); //脚本错误 缺少函数

其实上面的代码也就等价于下面的写法:

function anonymousClass() { return "jeff wong"; } //匿名类 
var instance = new anonymousClass(); 
alert(typeof (instance));//object 
alert(instance); //[object Object]

(3)、还是函数带个返回值的,写法稍微有点不同

下面的代码请注意和(2)中的区分一下,因为接下来要重点讨论的就是那一点点的不同书写形式:

var func = new function() { return new String("jeff wong"); }; 
alert(typeof (func)); //object 意料之中 
alert(func); //这里?! 
//alert(func()); //脚本错误 缺少函数

上面代码的等价形式依然简单:

function anonymousClass() { return new String("jeff wong"); } 
var instance = new anonymousClass(); 
alert(typeof (instance)); 
alert(instance);

已经运行看到结果了吗?没错,第三种写法我们在弹出func或者instance的时候,都出人意料地得到了一段字符串"jeff wong"。细心比较(2)和(3)中的代码,除了return处的写法稍有不同之外,两处代码几乎完全一致,所以我们推断,毫无疑问,是new String的形式让我们的函数产生了意想不到的效果。 为什么会这样呢?

原来,在javascript中,只要在new表达式之后的constructor返回(return)一个原始类型(无return时其实是return原始类型undefined,如(1)),比如第(2)种写法,那么就返回new创建的匿名对象;而如果new表达式之后的constructor返回一个引用对象,比如对象(Object),函数(function)及数组(Array)等等,那么返回的该引用对象就将覆盖new创建的匿名对象。现在再来分析(3)中的写法,由于new String会构造一个字符串引用对象,它就覆盖了new所创建的匿名对象,而new String的所指向引用值是“jeff wong”,所以弹出的必然是当前new String所分配的值。

最后,留个思考题,大家看看下面的代码返回什么结果:

var func = new function() { var str = new String("jeff wong"); return str; };//再换种写法 
//alert(typeof (func)); //object 意料之中 
alert(func); //猜一下这里应该是什么结果?

作者:Jeff Wong
Javascript 相关文章推荐
js 获取浏览器高度和宽度值(多浏览器)
Sep 02 Javascript
JavaScript将数据转换成整数的方法
Jan 04 Javascript
使用jquery写个更改表格行顺序的小功能
Apr 29 Javascript
javascript中alert()与console.log()的区别
Aug 26 Javascript
bootstrap下拉菜单使用方法解析
Jan 13 Javascript
jquery表单插件form使用方法详解
Jan 20 Javascript
javascript事件的传播基础实例讲解(35)
Feb 14 Javascript
详解JS中的attribute属性
Apr 25 Javascript
JS库 Highlightjs 添加代码行号的实现代码
Sep 13 Javascript
手写Node静态资源服务器的实现方法
Mar 20 Javascript
JS实现图片懒加载(lazyload)过程详解
Apr 02 Javascript
Vue vee-validate插件的简单使用
Jun 22 Vue.js
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
Jun 29 #Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
Jun 29 #Javascript
javascript hasFocus使用实例
Jun 29 #Javascript
jquery photoFrame 图片边框美化显示插件
Jun 28 #Javascript
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
Jun 28 #Javascript
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
Jun 28 #Javascript
Jquery ui css framework
Jun 28 #Javascript
You might like
如何将数据从文本导入到mysql
2006/10/09 PHP
PHP生成Flash动画的实现代码
2010/03/12 PHP
PHP中图片等比缩放的实例
2013/03/24 PHP
php图片处理函数获取类型及扩展名实例
2014/11/19 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
2010/04/18 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
2014/10/23 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
BootStrap selectpicker
2016/06/20 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
2016/11/01 Javascript
微信小程序 聊天室简单实现
2017/04/19 Javascript
微信小程序Redux绑定实例详解
2017/06/07 Javascript
jquery获取transform里的值实现方法
2017/12/12 jQuery
详解在Python的Django框架中创建模板库的方法
2015/07/20 Python
Python性能提升之延迟初始化
2016/12/04 Python
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
完美解决在oj中Python的循环输入问题
2018/06/25 Python
关于python3中setup.py小概念解析
2019/08/22 Python
Python Process多进程实现过程
2019/10/22 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
2020/03/19 Python
python编写softmax函数、交叉熵函数实例
2020/06/11 Python
深入分析python 排序
2020/08/24 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
python单例模式的应用场景实例讲解
2021/02/24 Python
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
行政部主管岗位职责
2013/12/28 职场文书
《老王》教学反思
2014/02/23 职场文书
舞蹈教育学专业自荐信
2014/06/15 职场文书
食品安全汇报材料
2014/08/18 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
应收账款管理制度
2015/08/06 职场文书