函数function语句、Function构造函数、函数直接量 function 执行sql语句

函数(function语句、Function构造函数、函数直接量) function 执行sql语句

函数是由这样的方式进行声明的:关键字 function、函数名、一组参数,以及置于括号中的待执行代码。

函数的构造语法有这三种:

Js代码
  1. functionfunctionName(arg0,arg1,...argN){statements}//function语句
  2. varfunction_name=newFunction(arg1,arg2,...,argN,function_body);//Function()构造函数
  3. varfunc=function(arg0,arg1,...argN){statements};//函数直接量

示例:

Js代码
  1. functionf(x){returnx*x};//function语句
  2. varf=newFunction("x","returnx*x;");//Function()构造函数
  3. varf=function(x){returnx*x;};//函数直接量

如果函数无明确的返回值,或调用了没有参数的 return 语句,那么它真正返回的值是undefined。

ECMAScript中的函数不能重载。可用相同的名字在同一个作用域中定义两个函数,而不会引发错误,但真正使用的是后一个函数。考虑下面的例子:

Js代码
  1. functiondoAdd(iNum){
  2. Alert(iNum+100);
  3. }
  4. functiondoAdd(iNum){
  5. Alert(iNum+10);
  6. }
  7. doAdd(10);//20

不过可以使用arguments对象避开这种限制。

函数实际上是功能完整的对象。Function类可以表示开发者定义的任何函数。用Function类直接创建函数的语法如下:

Js代码
  1. varfunction_name=newfunction(arg1,arg2,...,argN,function_body)

在上面的形式中,每个 arg都是一个参数,最后一个参数是函数主体(要执行的代码)。这些参数必须是字符串。

Js代码
  1. varsayHi=newFunction("sName","sMessage","alert('Hello'+sName+sMessage);");
  2. sayHi("jzj,","你好!");//Hellojzj,你好!

函数名只是指向函数的变量,那么可以把函数作为参数传递给另一个函数吗?答案是可以的,请看:

Js代码
  1. functioncallAnotherFunc(fnFunction,vArgument){
  2. fnFunction(vArgument);
  3. }
  4. vardoAdd=newFunction("iNum","alert(iNum+10)");
  5. callAnotherFunc(doAdd,10);//输出"20"
注意:尽管可以使用 Function 构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。不过,所有函数都应看作 Function 类的实例 。 

如果你定义的函数没有参数,那么可以只需给构造函数传递一个字符串(即函数的主体)即可。


注意:传递给构造函数Function()的参数中没有一个用于说明它要创建的函数名。用Function()构造函数创建的未命名函数有时被称为“匿名函数”。


Function()函数允许我们动态地建立和编译一个函数,它不会将我们限制在function语句预编译的函数体中。

函数直接量是一个表达式,它可以定义匿名函数。函数直接量的语法和function语句非常相似,只不过它被用作表达式,而不是用作语句,而且也无需指定函数名。语法:

Js代码
  1. varfunc=function(arg0,arg1,...argN){statements};//函数直接量
虽然函数直接量创建的是未命名函数,但是它的语法也规定它可以指定函数名,这在编写调用自身的递归函数时非常有用,例如:
Js代码
  1. varf=functionfact(x){
  2. if(x<=1){
  3. return1;
  4. }else{
  5. returnx*fact(x-1);
  6. }
  7. };
 

注:它并没有真正创建一个名为fact()函数,只是允许函数体用这个名字来引用自身。JavaScript1.5之前的版本中没有正确实现这种命名的函数直接量。

函数名并没有什么实质意义,它不过是用来保存函数的变量名字,可以将这个函数赋给其他变量,它仍然会以相同方式起作用:

Js代码
  1. functionsquare(x){returnx*x;}
  2. vara=square;
  3. varb=a(5);//b为25
这有点像C++中的函数指针了。

Function()构造函数和函数直接量之间的差别有一点就是:使用构造函数Function()创建的函数不使用词法作用域,相反的,它们总是被顶级函数来编译,如:

Js代码
  1. vary="global";
  2. functionconstructFunction(){
  3. vary="local";
  4. //Function()构造函数
  5. returnnewFunction("returny;");//不使用局部作用域
  6. }
  7. functionconstFunction(){
  8. vary="local";
  9. //函数直接量
  10. varf=function(){
  11. returny;//使用局部作用域
  12. };
  13. returnf;
  14. }
  15. //显示global,因为Function()构造函数返回的函数并不使用局部作用域
  16. alert(constructFunction()());
  17. //显示global,因为函数直接量返回的函数并使用局部作用域
  18. alert(constFunction()());
函数的实际参数:Arguments对象 

在函数代码中,使用特殊对象arguments,标识符arguments引用Arguments对象。开发者无需明确指出参数名,就能访问它们。例如,在函数sayHi()中,第一个参数是message。用arguments[0]也可以访问这个值,即第一个参数的值(第一个参数位于位置0,第二个参数位于位置1,依此类推)。因此,无需明确命名参数,就可以重写函数:

Js代码
  1. functionsayHi(){
  2. if(arguments[0]=="bye"){
  3. return;
  4. }
  5. Alert("Hello"+arguments[0]);
  6. }
当函数具有命名的参数时,Arguments对象的数组元素是存放函数参数的局部问题的同义词。arguments[]数组和命名了参数不过是引用同一变量的两种不同方法。用参数名改变一个参数的值同时会改变通过arguments[]获得的值,当然通过arguments[]数组改变参数的值同样会改变用参数名获取的参数值。如: 
Js代码
  1. functionf(x){
  2. alert(x);//显示参数的初始值
  3. arguments[0]=null;//改变数组元素也会改变x
  4. alert(x);//现在显示null
  5. }
Arguments的属性length

arguments还具有length属性,参数的个数可用arguments.length 得到。

与其他程序设计语言不同,ECMAScript不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意个数的参数(根据Netscape的文档,最多能接受25个),而不会引发任何错误。任何遗漏的参数都会以undefined传递给函数,多余25的参数将忽略。用arguments对象判断传递给函数的参数个数,即可模拟函数重载:

Js代码
  1. functiondoAdd(iNum){
  2. Alert(iNum+100);
  3. }
  4. functiondoAdd(iNum){
  5. Alert(iNum+10);
  6. }
  7. doAdd(10);//20
虽然不如重载那么好,不过已足可避开ECMAScript的这种限制。

Arguments对象还定义了callee属性,用来引用当前正在执行的函数。这对象未命名的函数调用自身非常有用。下面是一个未命名的函数直接量,用于计算阶乘:

Js代码
  1. varf=function(x){
  2. if(x<=1){
  3. return1;
  4. }
  5. returnx*arguments.callee(x-1);
  6. };
  7. alert(f(3));//6

当然也可以给它临时取个名:

var f = function tmpName(x) { if (x <= 1) {return 1; } return x * tmpName(x - 1); }; alert(f(3));//6

因为函数是引用类型,所以它们也有属性和方法。ECMAScript 定义的函数的属性 length (只读)声明了函数声明的参数个数,与arguments.length不同,这个length属性在函数体的内部与外部都有效 。例如:

Js代码
  1. functiondoAdd(iNum){
  2. alert(iNum+10);
  3. }
  4. functionsayHi(){
  5. alert("Hi");
  6. }
  7. alert(doAdd.length);//输出:1
  8. alert(sayHi.length);//输出:0

无论定义了几个参数, ECMAScript 函数可以接受任意多个参数(最多 25 个)。属性 length只是为查看默认情况下函数声明的参数个数提供了一种简便的方式,它不你见arguments是动态变的。

每个函数都有一个prototye属性,它引用的是预定义的原型对象。原型对象在使用new运算符把函数作为构造函数时起作用,它在定义新对象类时起着非常重要的的作用。

...

当函数需要使用一个在调用过程中都保持不变的值时,使用Function对象的属性比定义全局变量(这样会使用名字空间变得散乱)更加方便。虽然我们可以将这信息存储在一个全局变量中,但是由于这一信息是由函数自己使用的,所以不必使用全局变量,最好的方法莫过于将信息存储在Function对象的属性中。

Js代码
  1. //创建并初始化静态变量
  2. //因为函数声明在执行代码前处理,所以在函数声明前这样赋值是可以的
  3. uniqueInteger.counter=0;
  4. //下面的函数每次被调用时返回值都不同,
  5. //而且使用它自己的静态属性来跟踪它上次返回的值
  6. functionuniqueInteger(){
  7. //给静态变量加1,然后返回它的值
  8. returnuniqueInteger.counter++;
  9. }
  10. alert(uniqueInteger());//0
  11. alert(uniqueInteger());//1

这2个关键字可以很简单地理解为进行this引用对象(运行空间)强制转换, 二者的语法如下:

二者目的是相同的(动态更改函数的运行空间, 或者称作更改this指向的对象),只是在提供给函数的参数上的调用方法不同。

使用这两个方法可以像调用其他对象的方法一样调用函数。call()和applay()的第一个参数都是要调用的函数的对象,在函数体内这一参数是关键字this的值(意思是会把第一个参数赋给函数体内的this,this以后就指向了第一个参数)。call()的剩余参数是传递给要调用的函数的值。例如,要把两个数字传递给函数f(),并将它作为对象o的方法调用,可以使用如下的代码:

Js代码
  1. functionf(arg1,arg2){
  2. this.attr1=arg1;
  3. this.attr2=arg2;
  4. }
  5. //-----第一种调用法
  6. //如果在调用时前面未明确指定对象,则默认为window对象
  7. f(1,2);
  8. //我们可以看到上面确实是由window对象来调用的
  9. alert(window.attr1);
  10. alert(window.attr2);
  11. //-----第二种调用法
  12. //此时构造体内的this就是当前new出来的对象
  13. varfun=newf(3,4);
  14. alert(fun.attr1);//3
  15. alert(fun.attr2);//4
  16. //-----第三种调用法
  17. varo={};
  18. //此时构造函数体内的this就指向了o
  19. f.call(o,5,6);
  20. alert(o.attr1);//5
  21. alert(o.attr2);//6
  22. //f.call(o,5,6);与下面的代码相似
  23. o.m=f;
  24. o.m(5,6);
  25. deleteo.m;
  26. alert(o.attr1);//5
  27. alert(o.attr2);//6
  28. //虽然前面指定了调用对象,但this还是指向o
  29. window.f.call(o,7,8);
  30. alert(o.attr1);//7
  31. alert(o.attr2);//8

apply()方法和call()方法相似,只不过要传递给函数的参数是数组指定的:

Js代码
  1. f.apply(o,[5,6]);

例如,要找到一个数字数组中的最大数字,可以用apply()方法把数组元素传递给Math.max()函数:

Js代码
  1. vararray_of_numbers=[5,7,3,6];
  2. varbiggest=Math.max.apply(null,array_of_numbers);
  3. alert(biggest);//7
函数的方法valueOf()和toString() 

Function 对象也有与所有对象共享的标准valueOf () 方法和 toString() 方法。这两个方法返回的都是函数的源代码,在调试时尤其有用:

Js代码
  1. functiondoAdd(iNum){
  2. alert(iNum+10);
  3. }
  4. alert(doAdd.toString());
  5. alert(doAdd.valueOf

  

爱华网本文地址 » http://www.413yy.cn/a/25101018/375497.html

更多阅读

sql脚本怎样保存、打开脚本文件? bat脚本打开文件

sql脚本怎样保存、打开脚本文件?——简介相信数据库对于软件开发、实施或者测试来说都不陌生,不论是创建数据库表还是查询、添加、删除、修改的一些操作语句,都需要脚本文件。以SqlServer2005为例介绍其操作过程,其他数据基本相同。sql

瘦身杂粮粥——薏米、红豆、紫薯粥 五谷杂粮紫薯米

要想减肥,控制食欲,喝粥是个不错的办法。粥较米饭含有更多的水分,容易填饱肚子,又不摄入过多的能量。【原料】薏米、红豆(量为薏米的两倍)、紫薯、莲子、大米、小米....可根据各人口味添加食材。不过有一点要注意,主料为薏米、红豆(量为薏米

什么是现量、比量、证量、圣言量?_回归自性 回归自性论坛

什么是现量、比量、证量、圣言量? 1、现量、比量、圣教量。现量是用不著意识思索就能够直觉其存在,也就是直接之知,如人的手碰到火,立刻就知其存在是;比量是比度而知,也就是推理之知,如见远处有烟就知彼处必有火,听到隔壁有说话的声音,就知

终于找到一篇关于GH、KH、换算的帖子还比较详细 代发帖子

所谓水质(WaterQuality),是指水体各种指标参数的总和。包括酸碱度、硬度、盐度、水温、溶氧量、氨氮浓度等指标。实际上我们一般认为养鱼就是养水就是指的对这些指标的调节。PH值(酸碱度):水中酸性和碱性物质含量的多少。酸碱度用PH来表

IF函数解释 excel函数解释

IF(logical_test,value_if_true,value_if_false)Logical_test 表示IF函数第一判断(执行)条件,通过对Logical_test的判断(执行)可以返回结果为 TRUE 或 FALSE 的任意值或表达式。

声明:《函数function语句、Function构造函数、函数直接量 function 执行sql语句》为网友你不必爱我分享!如侵犯到您的合法权益请联系我们删除