JS函数的实际参数 简介

来源:互联网 发布:淘宝申请退款流程手机 编辑:程序博客网 时间:2024/05/16 11:52
函数的实际参数:Arguments对象 

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

Js代码
function sayHi() {       if (arguments[0] == "bye") {           return;       }       Alert("Hello" + arguments[0]);   }  

当函数具有命名的参数时,Arguments对象的数组元素是存放函数参数的局部问题的同义词。arguments[]数组和命名了参数不过是引用同一变量的两种不同方法。用参数名改变一个参数的值同时会改变通过arguments[]获得的值,当然通过arguments[]数组改变参数的值同样会改变用参数名获取的参数值。如:
Js代码
function f(x) {       alert(x);//显示参数的初始值        arguments[0] = null;//改变数组元素也会改变x        alert(x);//现在显示 null    }  

Arguments的属性length

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

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

Js代码
function doAdd(iNum) {       Alert(iNum + 100);   }   function doAdd(iNum) {       Alert(iNum + 10);   }   doAdd(10);//20   

  虽然不如重载那么好,不过已足可避开ECMAScript的这种限制。
  • Arguments的属性callee

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

Js代码
var f = function (x) {       if (x <= 1) {           return 1;       }       return x * arguments.callee(x - 1);   };   alert(f(3));//6   

 

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

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

  • 函数的属性length

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

Js代码
function doAdd(iNum) {       alert(iNum + 10);   }   function sayHi() {       alert("Hi");   }   alert(doAdd.length);//输出: 1    alert(sayHi.length);//输出: 0  

 

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

 

  • 函数的属性prototype

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

...

 

  • 定义你自己的函数属性

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

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

 
  • 函数的方法apply()和call()

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

  • fun.call(object, arg1, arg2, ...)
  • fun.apply(object, [arg1, arg2, ...])

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

 

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

Js代码
function f (arg1, arg2){       this.attr1 = arg1;       this.attr2 = arg2;   }   //-----第一种调用法   //如果在调用时前面未明确指定对象,则默认为window对象   f(1,2);   //我们可以看到上面确实是由window对象来调用的   alert(window.attr1);   alert(window.attr2);     //-----第二种调用法   //此时构造体内的this就是当前new出来的对象   var fun = new f(3,4);   alert(fun.attr1);//3   alert(fun.attr2);//4     //-----第三种调用法   var o = {};   //此时构造函数体内的this就指向了o   f.call(o,5,6);   alert(o.attr1);//5   alert(o.attr2);//6   //f.call(o,5,6);与下面的代码相似   o.m = f;   o.m(5,6);   delete o.m;   alert(o.attr1);//5   alert(o.attr2);//6     //虽然前面指定了调用对象,但this还是指向o   window.f.call(o,7,8);   alert(o.attr1);//7   alert(o.attr2);//8  

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

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

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

Js代码
var array_of_numbers = [5,7,3,6];   var biggest = Math.max.apply(null, array_of_numbers);   alert(biggest);//7  

函数的方法valueOf()和toString() 

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

Js代码
function doAdd(iNum) {       alert(iNum + 10);   }   alert(doAdd.toString());   alert(doAdd.valueOf

原创粉丝点击