通过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 相关文章推荐
ext读取两种结构的xml的代码
Nov 05 Javascript
javascript eval函数深入认识
Feb 21 Javascript
基于jQuery创建鼠标悬停效果的方法
Mar 07 Javascript
JQuery记住用户名密码实现下次自动登录功能
Apr 27 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
Jun 22 Javascript
AngularJS中的路由使用及实现代码
Oct 09 Javascript
微信小程序icon组件使用详解
Jan 31 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
Mar 05 Javascript
JavaScript常用数学函数用法示例
May 14 Javascript
浅析Vue.js 中的条件渲染指令
Nov 19 Javascript
toString.call()通用的判断数据类型方法示例
Aug 28 Javascript
使用AutoJs实现微信抢红包的代码
Dec 31 Javascript
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
网站当前的在线人数
2006/10/09 PHP
php下删除一篇文章生成的多个静态页面
2010/08/08 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
php操作access数据库的方法详解
2017/02/22 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
2019/03/11 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
2019/05/01 PHP
两个比较有用的Javascript工具函数代码
2010/02/17 Javascript
JQuery循环滚动图片代码
2011/12/08 Javascript
JS+CSS实现下拉列表框美化效果(3款)
2015/08/15 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
2017/02/26 Javascript
js实现简单数字变动效果
2017/11/06 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
2017/11/30 Javascript
JavaScript两种计时器的实例讲解
2019/01/31 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
[40:03]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#1EHOME VS Archon
2016/03/02 DOTA
Django实现的自定义访问日志模块示例
2017/06/23 Python
Django rest framework基本介绍与代码示例
2018/01/26 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
python 读取文本文件的行数据,文件.splitlines()的方法
2018/07/12 Python
mac安装pytorch及系统的numpy更新方法
2018/07/26 Python
Python3爬虫学习入门教程
2018/12/11 Python
python 接口实现 供第三方调用的例子
2019/08/13 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
2020/04/27 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
Whistles官网:英国女装品牌
2020/08/14 全球购物
实习自我鉴定范文
2013/10/30 职场文书
大学生蛋糕店创业计划书
2014/01/13 职场文书
2014年党员自我评议总结
2014/09/23 职场文书
商务代表岗位职责
2015/02/15 职场文书
体育部部长竞选稿
2015/11/21 职场文书
CSS 左边固定宽右边自适应的6种方法
2022/05/15 HTML / CSS