理解Javascript_08_函数对象

 更新时间:2010年10月15日 23:55:31   作者:  
如果你无法理解博文在讲什么,请回顾前面的系列博文。文章比较深入,如有不对之处,望请指正,谢谢。
函数对象
首先,大家得明确一个概念:函数就是对象,代表函数的对象就是函数对象。既然是对象,那它又是被谁构造出来的呢?下面我们来看一段描述: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的构造过程:

来自于一个整体的分析图:

图片本身已经能解释很多很多的问题了,结合前面instanceof原理,对象构造原理,原型链原理,自已去体会吧,我就不多说什么了。

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


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

相关文章

  • 微信小程序开发之组件设计规范

    微信小程序开发之组件设计规范

    这篇文章主要给大家介绍了关于微信小程序开发之组件设计规范的相关资料,对刚入门学习微信小程序的同学们还是挺有帮助的,需要的朋友可以参考下
    2021-05-05
  • Bootstrap组件系列之福利篇几款好用的组件(推荐)

    Bootstrap组件系列之福利篇几款好用的组件(推荐)

    这篇文章主要介绍了Bootstrap组件系列之福利篇几款好用的组件(推荐) 的相关资料,需要的朋友可以参考下
    2016-06-06
  • js实现简单省市区三级选择联级

    js实现简单省市区三级选择联级

    这篇文章主要介绍了js实现简单省市区三级选择联级,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • js实现杯子倒水问题自动求解程序

    js实现杯子倒水问题自动求解程序

    智力测试题经常遇到类似的逻辑题,给几个容量不等的杯子,让你倒出多少的水,感兴趣的朋友可以参考下哈希望可以帮助到你
    2013-03-03
  • 使用ionic切换页面卡顿的解决方法

    使用ionic切换页面卡顿的解决方法

    使用ionic开发app的时候,会发现切换页面的动画会卡顿,并不流畅,为了保证用户体验,大家采用cordova提供的native transitions可以让页面切换近乎原型的体验,一起通过本文学习下具体实现思路
    2016-12-12
  • JavaScript设计模型Iterator实例解析

    JavaScript设计模型Iterator实例解析

    这篇文章主要介绍了JavaScript设计模型Iterator实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 关于TypeScript应该尽量避免的语法总结

    关于TypeScript应该尽量避免的语法总结

    TypeScript是JavaScript的超集,具有类型系统,支持ES6语法,支持面向对象编程的概念,下面这篇文章主要给大家介绍了关于TypeScript应该尽量避免的语法,需要的朋友可以参考下
    2022-04-04
  • 提升JS编程效率的19个实用技巧分享

    提升JS编程效率的19个实用技巧分享

    在实际工作中,开发者常面临一些需巧妙编程解决的挑战,有时几行代码就能迎刃而解,本文整理了一系列实用代码片段,助您轻松处理URL、DOM操作、事件处理等常见问题,希望对大家有所帮助
    2023-11-11
  • 小程序开发实战指南之封装自定义弹窗组件

    小程序开发实战指南之封装自定义弹窗组件

    最近在做公司的小程序项目,发现设计上有很多不统一,代码上有很多冗余,下面这篇文章主要给大家介绍了关于小程序开发实战指南之封装自定义弹窗组件的相关资料,需要的朋友可以参考下
    2022-11-11
  • JavaScript实现的简单幂函数实例

    JavaScript实现的简单幂函数实例

    这篇文章主要介绍了JavaScript实现的简单幂函数,实例分析了javascript实现幂运算的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04

最新评论