理解Javascript_08_函数对象


Posted in Javascript onOctober 15, 2010

函数对象
首先,大家得明确一个概念:函数就是对象,代表函数的对象就是函数对象。既然是对象,那它又是被谁构造出来的呢?下面我们来看一段描述:JavaScript代码中定义函数,或者调用Function创建函数时,最终都会以类似这样的形式调用Function函数:var newFun=Function(funArgs, funBody); 。由此可知函数对象是由Function这个函数对象构造出来的。
注:Function对象本身也是一个函数,因此它也一个函数对象。关于Function的深入理解,请见后续博文。
正面我们来看一段代码:

//定义方式一 
function func(x) { 
alert(x); 
} 
//定义方式二 
var func = function(x) { 
alert(x); 
}; 
//实际执行 
var func = new Function(“x”, “alert(x);”);

通过上面的代码可知,函数func无非是由Function对象接收两个参数后构造出来的而矣!

注:关于定义方式一与定义方式二的区别,请见后续博文

函数对象的创建过程

函数对象详细创建步骤如下:

1. 创建一个build-in object对象fn

2. 将fn的内部[[Prototype]]设为Function.prototype
3. 设置内部的[[Call]]属性,它是内部实现的一个方法,处理函数调用的逻辑。(简单的理解为调用函数体)

4. 设置内部的[[Construct]]属性,它是内部实现的一个方法,处理逻辑参考对象创建过程。(简单的理解为创建对象《理解Javascript_06_理解对象的创建过程》一文)

5. 设置fn.length为funArgs.length,如果函数没有参数,则将fn.length设置为0
6. 使用new Object()同样的逻辑创建一个Object对象fnProto
7. 将fnProto.constructor设为fn
8. 将fn.prototype设为fnProto
9. 返回fn

步骤1跟步骤6的区别为,步骤1只是创建内部用来实现Object对象的数据结构(build-in object structure),并完成内部必要的初始化工作,但它的[[Prototype]]、[[Call]]、[[Construct]]等属性应当为 null或者内部初始化值,即我们可以理解为不指向任何对象(对[[Prototype]]这样的属性而言),或者不包含任何处理(对 [[Call]]、[[Construct]]这样的方法而言)。步骤6则将按照《理解Javascript_06_理解对象的创建过程》创建一个新的对象,它的 [[Prototype]]等被设置了。
从上面的处理步骤可以了解,任何时候我们定义一个函数,它的prototype是一个Object实例,这样默认情况下我们创建自定义函数的实例对象时,它们的Prototype链将指向Object.prototype。

注:Function一个特殊的地方,是它的[[Call]]和[[Construct]]处理逻辑一样。深层次的原因将在后续博文中介绍。

下面我们写一些用例脚本来测试一下上面的理论:

function Animal(){ 
} 
alert(Animal.length);//0 var dog = new Animal();

这个JS证明了步骤5的正确性。最后,还是来看一下函数对象的内存图,简单起见,内存图只描述了Animal的构造过程:
理解Javascript_08_函数对象
来自于一个整体的分析图:
理解Javascript_08_函数对象
图片本身已经能解释很多很多的问题了,结合前面instanceof原理,对象构造原理,原型链原理,自已去体会吧,我就不多说什么了。

其实上Function对象是一个很奇妙的对象,它与Object的关系更是扑朔迷离,我将在《理解Javascript_09_Function与Object》中解释这一切。

最后的声明:理论过于复杂,我不改保证其正确性。但经过多方的测试,还未发现理论与实际冲突的地方。

Javascript 相关文章推荐
javascript在一段文字中的光标处插入其他文字
Aug 26 Javascript
JS 动态获取节点代码innerHTML分析 [IE,FF]
Nov 30 Javascript
jquery 操作两个select实现值之间的互相传递
Mar 07 Javascript
javascript对JSON数据排序的3个例子
Apr 12 Javascript
Javascript实现鼠标右键特色菜单
Aug 04 Javascript
微信小程序使用第三方库Underscore.js步骤详解
Sep 27 Javascript
jQuery+ajax实现修改密码验证功能实例详解
Jul 06 jQuery
元素全屏的设置与监听实例
Nov 28 Javascript
详解vue 在移动端体验上的优化解决方案
May 20 Javascript
vue项目中常见问题及解决方案(推荐)
Oct 21 Javascript
openlayers4.6.5实现距离量测和面积量测
Sep 25 Javascript
Vue vee-validate插件的简单使用
Jun 22 Vue.js
javascript instanceof 内部机制探析
Oct 15 #Javascript
理解Javascript_07_理解instanceof实现原理
Oct 15 #Javascript
JavaScript 对象模型 执行模型
Oct 15 #Javascript
理解Javascript_06_理解对象的创建过程
Oct 15 #Javascript
JavaScript聚焦于第一个字段的代码
Oct 15 #Javascript
JavaScript访问样式表代码
Oct 15 #Javascript
IE下js调试工具Companion.JS
Oct 15 #Javascript
You might like
谈一谈收音机的高放电路
2021/03/02 无线电
php smarty 二级分类代码和模版循环例子
2011/06/01 PHP
PHP中遍历stdclass object的实现代码
2011/06/09 PHP
php开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
php.ini 配置文件的深入解析
2013/06/17 PHP
php实现搜索类封装示例
2016/03/31 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
菜鸟javascript基础资料整理3 正则
2010/12/06 Javascript
js获取GridView中行数据的两种方法 分享
2013/07/13 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
2016/01/27 Javascript
jQuery 限制输入字符串长度
2016/06/20 Javascript
利用require.js与angular搭建spa应用的方法实例
2017/07/19 Javascript
iview table render集成switch开关的实例
2018/03/14 Javascript
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
[02:17]TI4西雅图DOTA2前线报道 啸天mik夫妻档解说
2014/07/08 DOTA
Python使用requests发送POST请求实例代码
2018/01/25 Python
python学习入门细节知识点
2018/03/29 Python
对python中raw_input()和input()的用法详解
2018/04/22 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
CSS3中Color的一些特性介绍
2012/05/27 HTML / CSS
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
美国克罗格超市在线购物:Kroger
2019/06/21 全球购物
LUISAVIAROMA德国官网:时尚奢侈品牌购物网站
2020/11/12 全球购物
.NET初级开发工程师面试题
2014/04/18 面试题
岗位说明书标准范本
2014/07/30 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
2015年党总支工作总结
2015/05/25 职场文书
少先大队干部竞选稿
2015/11/20 职场文书
2016年秋季趣味运动会开幕词
2016/03/04 职场文书
python中mongodb包操作数据库
2022/04/19 Python