理解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 相关文章推荐
juqery 学习之四 筛选查找
Nov 30 Javascript
jquery 操作iframe的几种方法总结
Dec 13 Javascript
FireBug 调试JS入门教程 如何调试JS
Dec 23 Javascript
jQuery移除tr无效的解决方法(tr是动态添加)
Sep 22 Javascript
node.js中的fs.stat方法使用说明
Dec 16 Javascript
jquery对象访问是什么及使用方法介绍
May 03 Javascript
JavaScript实现阿拉伯数字和中文数字互相转换
Jun 12 Javascript
javascript 通过键名获取键盘的keyCode方法
Dec 31 Javascript
fastadmin中调用js的方法
May 14 Javascript
element-ui表格合并span-method的实现方法
May 21 Javascript
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
Aug 22 Javascript
JavaScript代码实现微博批量取消关注功能
Feb 05 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
destoon安装出现Internal Server Error的解决方法
2014/06/21 PHP
基于PHP的简单采集数据入库程序【续篇】
2014/07/30 PHP
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
JavaScript中的面向对象介绍
2012/06/30 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
JQuery中serialize()用法实例分析
2015/02/06 Javascript
JS实现生成会变大变小的圆环实例
2015/08/05 Javascript
angularJs关于指令的一些冷门属性详解
2016/10/24 Javascript
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
2017/03/21 jQuery
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
vue项目实战总结篇
2018/02/11 Javascript
微信小程序动态设置图片大小的方法
2019/11/21 Javascript
Vue 自适应高度表格的实现方法
2020/05/13 Javascript
详解uniapp的全局变量实现方式
2021/01/11 Javascript
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
[01:18:31]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第一场 1月10日
2021/03/11 DOTA
Python 检查数组元素是否存在类似PHP isset()方法
2014/10/14 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
python3+PyQt5 实现Rich文本的行编辑方法
2019/06/17 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
keras做CNN的训练误差loss的下降操作
2020/06/22 Python
Python2及Python3如何实现兼容切换
2020/09/01 Python
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
计算机专业毕业生求职信分享
2013/12/24 职场文书
大学毕业感言50字
2014/02/07 职场文书
《十六年前的回忆》教学反思
2014/02/14 职场文书
《云房子》教学反思
2014/04/20 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
金正昆讲礼仪观后感
2015/06/11 职场文书
python not运算符的实例用法
2021/06/30 Python
基于Python实现射击小游戏的制作
2022/04/06 Python
CentOS7安装GlusterFS集群以及相关配置
2022/04/12 Servers