理解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 相关文章推荐
jQuery easyui datagrid动态查询数据实例讲解
Feb 26 Javascript
Jquery显示、隐藏元素以及添加删除样式
Aug 09 Javascript
JS实现图片横向滚动效果示例代码
Sep 04 Javascript
深入理解javascript的执行顺序
Apr 04 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
Apr 03 Javascript
高性能JavaScript DOM编程(1)
Aug 11 Javascript
jQuery实现简单的图片查看器
Sep 11 Javascript
基于vue.js实现侧边菜单栏
Mar 20 Javascript
网页中的图片查看器viewjs使用方法
Jul 11 Javascript
纯js实现画一棵树的示例
Sep 05 Javascript
JavaScript实现省市联动效果
Nov 22 Javascript
JavaScript代码简化技巧实例解析
Sep 09 Javascript
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
基于mysql的bbs设计(五)
2006/10/09 PHP
set_exception_handler函数在ThinkPHP中的用法
2014/10/31 PHP
php数组排序usort、uksort与sort函数用法
2014/11/17 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
2015/12/16 PHP
PHP简单实现欧拉函数Euler功能示例
2017/11/06 PHP
PHP实现的curl批量请求操作示例
2018/06/06 PHP
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
2007/02/22 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
javascript学习笔记(十九) 节点的操作实现代码
2012/06/20 Javascript
jQuery插件echarts实现的多柱子柱状图效果示例【附demo源码下载】
2017/03/04 Javascript
vue将时间戳转换成自定义时间格式的方法
2018/03/02 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
layui中使用jquery控制radio选中事件的示例代码
2018/08/15 jQuery
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
JS事件绑定的常用方式实例总结
2019/03/02 Javascript
Vue指令之 v-cloak、v-text、v-html实例详解
2019/08/08 Javascript
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
使用vuex存储用户信息到localStorage的实例
2019/11/11 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
在vue-cli创建的项目中使用sass操作
2020/08/10 Javascript
Django自定义分页与bootstrap分页结合
2021/02/22 Python
对pandas中to_dict的用法详解
2018/06/05 Python
使用python制作一个为hex文件增加版本号的脚本实例
2019/06/12 Python
Python中一个for循环循环多个变量的示例
2019/07/16 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
Bodum官网:咖啡和茶壶、玻璃器皿、厨房电器等
2018/08/01 全球购物
Tomcat的缺省是多少,怎么修改
2014/04/09 面试题
建筑专业自荐信
2013/10/18 职场文书
经典英文广告词
2014/03/18 职场文书
商务日语专业毕业生自荐信
2014/03/27 职场文书
5s标语大全
2014/06/23 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书
2015暑期社会实践通讯稿
2015/07/18 职场文书
剑指Offer之Java算法习题精讲二叉树的构造和遍历
2022/03/21 Java/Android
VMware虚拟机安装 Windows Server 2022的详细图文教程
2022/09/23 Servers