开发者社区> 嗯哼9925> 正文

理解JavaScript函数(函数和对象的区别和联系)

简介:
+关注继续查看

函数对象和其他内部对象的关系

 


除了函数对象,还有很多内部对象,比如:Object、Array、Date、RegExp、Math、Error。这些名称实际上表示一个类型,可以通过new操作符返回一个对象。然而函数对象和其他对象不同,当用typeof得到一个函数对象的类型时,它仍然会返回字符串“function”,而typeof一个数组对象或其他的对象时,它会返回字符串“object”。下面的代码示例了typeof不同类型的情况:

以下是引用片段:

1
2
3
4
5
6
7
alert(typeof(Function)));
alert(typeof(new Function()));
alert(typeof(Array));
alert(typeof(Object));
alert(typeof(new Array()));
alert(typeof(new Date()));
alert(typeof(new Object()));


运行这段代码可以发现:前面4条语句都会显示“function”,而后面3条语句则显示“object”,可见new一个function实际上是返回一个函数。这与其他的对象有很大的不同。其他的类型Array、Object等都会通过new操作符返回一个普通对象。尽管函数本身也是一个对象,但它与普通的对象还是有区别的,因为它同时也是对象构造器,也就是说,可以new一个函数来返回一个对象,这在前面已经介绍。所有typeof返回“function”的对象都是函数对象。也称这样的对象为构造器(constructor),因而,所有的构造器都是对象,但不是所有的对象都是构造器。

  既然函数本身也是一个对象,它们的类型是function,联想到C++、Java等面向对象语言的类定义,可以猜测到Function类型的作用所在,那就是可以给函数对象本身定义一些方法和属性,借助于函数的prototype对象,可以很方便地修改和扩充Function类型的定义,例如下面扩展了函数类型Function,为其增加了method1方法,作用是弹出对话框显示"function":

以下是引用片段:

1
2
3
4
5
6
7
8
Function.prototype.method1=function(){
      alert("function");
}
function func1(a,b,c){
      return a+b+c;
}
func1.method1();
func1.method1.method1();


注意最后一个语句:func1.method1.mehotd1(),它调用了method1这个函数对象的method1方法。虽然看上去有点容易混淆,但仔细观察一下语法还是很明确的:这是一个递归的定义。因为method1本身也是一个函数,所以它同样具有函数对象的属性和方法,所有对Function类型的方法扩充都具有这样的递归性质。

  Function是所有函数对象的基础,而Object则是所有对象(包括函数对象)的基础。在JavaScript中,任何一个对象都是Object的实例,因此,可以修改Object这个类型来让所有的对象具有一些通用的属性和方法,修改Object类型是通过prototype来完成的:

以下是引用片段:

1
2
3
4
5
6
7
8
9
Object.prototype.getType=function(){
       return typeof(this);
}
var array1=new Array();
function func1(a,b){
      return a+b;
}
alert(array1.getType());
alert(func1.getType());


上面的代码为所有的对象添加了getType方法,作用是返回该对象的类型。两条alert语句分别会显示“object”和“function”。

      将函数作为参数传递

  在前面已经介绍了函数对象本质,每个函数都被表示为一个特殊的对象,可以方便的将其赋值给一个变量,再通过这个变量名进行函数调用。作为一个变量,它可以以参数的形式传递给另一个函数,这在前面介绍JavaScript事件处理机制中已经看到过这样的用法,例如下面的程序将func1作为参数传递给func2:

以下是引用片段:

1
2
3
4
5
6
7
function func1(theFunc){
      theFunc();
}
function func2(){
      alert("ok");
}
func1(func2);

  在最后一条语句中,func2作为一个对象传递给了func1的形参theFunc,再由func1内部进行theFunc的调用。事实上,将函数作为参数传递,或者是将函数赋值给其他变量是所有事件机制的基础。

例如,如果需要在页面载入时进行一些初始化工作,可以先定义一个init的初始化函数,再通过window.onload=init;语句将其绑定到页面载入完成的事件。这里的init就是一个函数对象,它可以加入window的onload事件列表。








本文转自豪情博客园博客,原文链接:http://www.cnblogs.com/jikey/archive/2010/04/28/1722971.html,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
js中函数内部属性arguments和this以及方法apply()和call()
js中函数内部属性arguments和this以及方法apply()和call()
16 0
前端祖传三件套JavaScript的函数之箭头函数
当今的前端开发中,JavaScript 语言几乎是必不可少的。而 JavaScript 的函数也是其中最基础、最重要的部分之一。在日常的工作中,我们经常会用到箭头函数,它是 ES6 新增的语言特性,可以帮助程序员更快速地编写出代码。那么,什么是箭头函数?它有哪些优点和注意事项呢?
19 0
前端祖传三件套JavaScript的函数之函数参数
在 JavaScript 中,函数参数是非常重要的概念,它们可以帮助我们向函数中传递数据和信息,并且可以增强函数的灵活性和可维护性。本文将介绍 JavaScript 函数参数的使用方法、传递方式以及一些常见的注意事项.
10 0
前端祖传三件套JavaScript的函数之函数调用
JavaScript 函数可以被调用多次,这使得它们极其灵活和实用。在本文中,我们将讨论 JavaScript 函数的调用方式、传递参数以及一些常见的注意事项。
11 0
前端祖传三件套JavaScript的函数之call()方法/apply()方法
在JavaScript中,函数是一种非常重要的语言特性,可以帮助我们实现各种功能。 Function.prototype上提供了两个函数 call() 和 apply(),它们允许您在调用函数时指定this的值,以及传递参数。本文将介绍这两个方法的用法、区别和注意事项。
12 0
前端祖传三件套JavaScript的函数之闭包
在 JavaScript 中,闭包是一个非常重要的概念,它允许函数访问其外部作用域中定义的变量和函数。本文将介绍闭包的概念、使用方法以及一些常见的注意事项。
15 0
JS:JS中常见的 “函数名 is not a function” 错误
JS:JS中常见的 “函数名 is not a function” 错误
100 0
前端祖传三件套JavaScript的函数之匿名函数
在JavaScript中,函数是实现各种功能和业务逻辑的基本手段。除了常规的函数声明和函数表达式外,JavaScript还支持匿名函数的定义方式。在这篇文章中,我们将介绍JavaScript中的匿名函数,以及其使用方法和注意事项
18 0
前端祖传三件套JavaScript的函数之Function() 构造器
在JavaScript中,函数是实现各种功能和业务逻辑的基本手段。除了常规的函数声明和函数表达式外,JavaScript还支持通过Function()构造器来进行函数定义。在这篇文章中,我们将介绍JavaScript中的Function()构造器,以及其使用方法和注意事项。
10 0
+关注
嗯哼9925
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
在 IoT 设备进行 JavaScript 开发的探索之路
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多