理解JavaScript函数 函数传参Word格式.docx
- 文档编号:15844185
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:17
- 大小:25.99KB
理解JavaScript函数 函数传参Word格式.docx
《理解JavaScript函数 函数传参Word格式.docx》由会员分享,可在线阅读,更多相关《理解JavaScript函数 函数传参Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
func5=new
Function();
这些都是声明函数的正确语法。
它们和其他语言中常见的函数或之前介绍的函数定义方式有着很大的区别。
那么在JavaScript中为什么能这么写?
它所遵循的语法是什么呢?
下面将介绍这些内容。
认识函数对象(FunctionObject)
可以用function关键字定义一个函数,并为每个函数指定一个函数名,通过函数名来进行调用。
在JavaScript解释执行时,函数都是被维护为一个对象,这就是要介绍的函数对象(FunctionObject)。
函数对象与其他用户所定义的对象有着本质的区别,这一类对象被称之为内部对象,例如日期对象(Date)、数组对象(Array)、字符串对象(String)都属于内部对象。
这些内置对象的构造器是由JavaScript本身所定义的:
通过执行newArray()这样的语句返回一个对象,JavaScript内部有一套机制来初始化返回的对象,而不是由用户来指定对象的构造方式。
在JavaScript中,函数对象对应的类型是Function,正如数组对象对应的类型是Array,日期对象对应的类型是Date一样,可以通过newFunction()来创建一个函数对象,也可以通过function关键字来创建一个对象。
为了便于理解,我们比较函数对象的创建和数组对象的创建。
先看数组对象:
下面两行代码都是创建一个数组对象myArray:
myArray=[];
//等价于
myArray=new
Array();
同样,下面的两段代码也都是创建一个函数myFunction:
myFunction(a,b){
return
a+b;
}
myFunction=new
Function("
a"
"
b"
a+b"
);
通过和构造数组对象语句的比较,可以清楚的看到函数对象本质,前面介绍的函数声明是上述代码的第一种方式,而在解释器内部,当遇到这种语法时,就会自动构造一个Function对象,将函数作为一个内部的对象来存储和运行。
从这里也可以看到,一个函数对象名称(函数变量)和一个普通变量名称具有同样的规范,都可以通过变量名来引用这个变量,但是函数变量名后面可以跟上括号和参数列表来进行函数调用。
用newFunction()的形式来创建一个函数不常见,因为一个函数体通常会有多条语句,如果将它们以一个字符串的形式作为参数传递,代码的可读性差。
下面介绍一下其使用语法:
funcName=new
Function(p1,p2,...,pn,body);
参数的类型都是字符串,p1到pn表示所创建函数的参数名称列表,body表示所创建函数的函数体语句,funcName就是所创建函数的名称。
可以不指定任何参数创建一个空函数,不指定funcName创建一个无名函数,当然那样的函数没有任何意义。
需要注意的是,p1到pn是参数名称的列表,即p1不仅能代表一个参数,它也可以是一个逗号隔开的参数列表,例如下面的定义是等价的:
new
"
c"
a+b+c"
)
a,
b,
a,b"
)
JavaScript引入Function类型并提供newFunction()这样的语法是因为函数对象添加属性和方法就必须借助于Function这个类型。
函数的本质是一个内部对象,由JavaScript解释器决定其运行方式。
通过上述代码创建的函数,在程序中可以使用函数名进行调用。
本节开头列出的函数定义问题也得到了解释。
注意可直接在函数声明后面加上括号就表示创建完成后立即进行函数调用,例如:
i=function
(a,b){
}(1,2);
alert(i);
这段代码会显示变量i的值等于3。
i是表示返回的值,而不是创建的函数,因为括号“(”比等号“=”有更高的优先级。
这样的代码可能并不常用,但当用户想在很长的代码段中进行模块化设计或者想避免命名冲突,这是一个不错的解决办法。
需要注意的是,尽管下面两种创建函数的方法是等价的:
funcName(){
//函数体
funcName=function(){
但前面一种方式创建的是有名函数,而后面是创建了一个无名函数,只是让一个变量指向了这个无名函数。
在使用上仅有一点区别,就是:
对于有名函数,它可以出现在调用之后再定义;
而对于无名函数,它必须是在调用之前就已经定义。
例如:
<script
language="
JavaScript"
type="
text/javascript"
>
<!
--
func();
func=function(){
alert
(1)
//-->
</script>
这段语句将产生func未定义的错误,而:
func(){
则能够正确执行,下面的语句也能正确执行:
someFunc=function
由此可见,尽管JavaScript是一门解释型的语言,但它会在函数调用时,检查整个代码中是否存在相应的函数定义,这个函数名只有是通过functionfuncName()形式定义的才会有效,而不能是匿名函数。
函数对象和其他内部对象的关系
除了函数对象,还有很多内部对象,比如:
Object、Array、Date、RegExp、Math、Error。
这些名称实际上表示一个类型,可以通过new操作符返回一个对象。
然而函数对象和其他对象不同,当用typeof得到一个函数对象的类型时,它仍然会返回字符串“function”,而typeof一个数组对象或其他的对象时,它会返回字符串“object”。
下面的代码示例了typeof不同类型的情况:
alert(typeof(Function)));
alert(typeof(new
Function()));
alert(typeof(Array));
alert(typeof(Object));
Array()));
Date()));
Object()));
运行这段代码可以发现:
前面4条语句都会显示“function”,而后面3条语句则显示“object”,可见new一个function实际上是返回一个函数。
这与其他的对象有很大的不同。
其他的类型Array、Object等都会通过new操作符返回一个普通对象。
尽管函数本身也是一个对象,但它与普通的对象还是有区别的,因为它同时也是对象构造器,也就是说,可以new一个函数来返回一个对象,这在前面已经介绍。
所有typeof返回“function”的对象都是函数对象。
也称这样的对象为构造器(constructor),因而,所有的构造器都是对象,但不是所有的对象都是构造器。
既然函数本身也是一个对象,它们的类型是function,联想到C++、Java等面向对象语言的类定义,可以猜测到Function类型的作用所在,那就是可以给函数对象本身定义一些方法和属性,借助于函数的prototype对象,可以很方便地修改和扩充Function类型的定义,例如下面扩展了函数类型Function,为其增加了method1方法,作用是弹出对话框显示"
function"
:
Function.prototype.method1=function(){
alert("
func1(a,b,c){
a+b+c;
func1.method1();
func1.method1.method1();
注意最后一个语句:
func1.method1.mehotd1(),它调用了method1这个函数对象的method1方法。
虽然看上去有点容易混淆,但仔细观察一下语法还是很明确的:
这是一个递归的定义。
因为method1本身也是一个函数,所以它同样具有函数对象的属性和方法,所有对Function类型的方法扩充都具有这样的递归性质。
Function是所有函数对象的基础,而Object则是所有对象(包括函数对象)的基础。
在JavaScript中,任何一个对象都是Object的实例,因此,可以修改Object这个类型来让所有的对象具有一些通用的属性和方法,修改Object类型是通过prototype来完成的:
Object.prototype.getType=function(){
typeof(this);
array1=new
func1(a,b){
alert(array1.getType());
alert(func1.getType());
上面的代码为所有的对象添加了getType方法,作用是返回该对象的类型。
两条alert语句分别会显示“object”和“function”。
将函数作为参数传递
在前面已经介绍了函数对象本质,每个函数都被表示为一个特殊的对象,可以方便的将其赋值给一个变量,再通过这个变量名进行函数调用。
作为一个变量,它可以以参数的形式传递给另一个函数,这在前面介绍JavaScript事件处理机制中已经看到过这样的用法,例如下面的程序将func1作为参数传递给func2:
func1(theFunc){
the
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 理解JavaScript函数 函数传参 理解 JavaScript 函数