AJax技术

AJAX学习:理解JavaScript函数(3)

字号+ 作者:H5之家 来源:H5之家 2015-10-31 13:10 我要评论( )

Ajax教程:AJAX学习:理解JavaScript函数(3)。将函数作为参数传递在前面已经介绍了函数对象本质,每个函数都被表示为一个特殊的对象,可以方便的将其赋值给一个变

  将函数作为参数传递
  
  在前面已经介绍了函数对象本质,每个函数都被表示为一个特殊的对象,可以方便的将其赋值给一个变量,再通过这个变量名进行函数调用。作为一个变量,它可以以参数的形式传递给另一个函数,这在前面介绍JavaScript事件处理机制中已经看到过这样的用法,例如下面的程序将func1作为参数传递给func2:
  
  以下为引用的内容:
  
  functionfunc1(theFunc){
  
  theFunc();
  
  }
  
  functionfunc2(){
  
  alert("ok");
  
  }
  
  func1(func2);
  
  在最后一条语句中,func2作为一个对象传递给了func1的形参theFunc,再由func1内部进行theFunc的调用。事实上,将函数作为参数传递,或者是将函数赋值给其他变量是所有事件机制的基础。
  
  例如,如果需要在页面载入时进行一些初始化工作,可以先定义一个init的初始化函数,再通过window.onload=init;语句将其绑定到页面载入完成的事件。这里的init就是一个函数对象,它可以加入window的onload事件列表。
  
  传递给函数的隐含参数:arguments
  
  当进行函数调用时,除了指定的参数外,还创建一个隐含的对象——arguments。arguments是一个类似数组但不是数组的对象,说它类似是因为它具有数组一样的访问性质,可以用arguments[index]这样的语法取值,拥有数组长度属性length。arguments对象存储的是实际传递给函数的参数,而不局限于函数声明所定义的参数列表,例如:
  
  以下为引用的内容:
  
  functionfunc(a,b){
  
  alert(a);
  
  alert(b);
  
  for(vari=0;i<arguments.length;i++){
  
  alert(arguments[i]);
  
  }
  
  }
  
  func(1,2,3);
  
  代码运行时会依次显示:1,2,1,2,3。因此,在定义函数的时候,即使不指定参数列表,仍然可以通过arguments引用到所获得的参数,这给编程带来了很大的灵活性。arguments对象的另一个属性是callee,它表示对函数对象本身的引用,这有利于实现无名函数的递归或者保证函数的封装性,例如使用递归来计算1到n的自然数之和:
  
  以下为引用的内容:
  
  varsum=function(n){
  
  if(1==n)return1;
  
  elsereturnn+sum(n-1);
  
  }
  
  alert(sum(100));
  
  其中函数内部包含了对sum自身的调用,然而对于JavaScript来说,函数名仅仅是一个变量名,在函数内部调用sum即相当于调用一个全局变量,不能很好的体现出是调用自身,所以使用arguments.callee属性会是一个较好的办法:
  
  以下为引用的内容:
  
  varsum=function(n){
  
  if(1==n)return1;
  
  elsereturnn+arguments.callee(n-1);
  
  }
  
  alert(sum(100));
  
  callee属性并不是arguments不同于数组对象的惟一特征,下面的代码说明了arguments不是由Array类型创建:
  
  以下为引用的内容:
  
  Array.prototype.p1=1;
  
  alert(newArray().p1);
  
  functionfunc(){
  
  alert(arguments.p1);
  
  }
  
  func();
  
  运行代码可以发现,第一个alert语句显示为1,即表示数组对象拥有属性p1,而func调用则显示为“undefined”,即p1不是arguments的属性,由此可见,arguments并不是一个数组对象。
  
  函数的apply、call方法和length属性
  
  JavaScript为函数对象定义了两个方法:apply和call,它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数的方式有所区别:
  
  以下为引用的内容:
  
  Function.prototype.apply(thisArg,argArray);
  
  Function.prototype.call(thisArg[,arg1[,arg2…]]);
  
  从函数原型可以看到,第一个参数都被取名为thisArg,即所有函数内部的this指针都会被赋值为thisArg,这就实现了将函数作为另外一个对象的方法运行的目的。两个方法除了thisArg参数,都是为Function对象传递的参数。下面的代码说明了apply和call方法的工作方式:
  
  以下为引用的内容:
  
  //定义一个函数func1,具有属性p和方法A
  
  functionfunc1(){
  
  this.p="func1-";
  
  this.A=function(arg){
  
  alert(this.p+arg);
  
  }
  
  }
  
  //定义一个函数func2,具有属性p和方法B
  
  functionfunc2(){
  
  this.p="func2-";
  
  this.B=function(arg){
  
  alert(this.p+arg);
  
  }
  
  }
  
  varobj1=newfunc1();
  
  varobj2=newfunc2();
  
  obj1.A("byA");//显示func1-byA
  
  obj2.B("byB");//显示func2-byB
  
  obj1.A.apply(obj2,["byA"]);//显示func2-byA,其中[“byA”]是仅有一个元素的数组,下同
  
  obj2.B.apply(obj1,["byB"]);//显示func1-byB
  
  obj1.A.call(obj2,"byA");//显示func2-byA
  
  obj2.B.call(obj1,"byB");//显示func1-byB
  
  可以看出,obj1的方法A被绑定到obj2运行后,整个函数A的运行环境就转移到了obj2,即this指针指向了obj2。同样obj2的函数B也可以绑定到obj1对象去运行。代码的最后4行显示了apply和call函数参数形式的区别。
  
  与arguments的length属性不同,函数对象还有一个属性length,它表示函数定义时所指定参数的个数,而非调用时实际传递的参数个数。例如下面的代码将显示2:
  
  以下为引用的内容:
  
  functionsum(a,b){
  
  returna+b;
  
  }
  
  alert(sum.length);
  
  点这里查看更多Ajax教程

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • AJAX教程–jQuery

    AJAX教程–jQuery

    2016-01-24 16:06

  • 全面剖析XMLHttpRequest对象

    全面剖析XMLHttpRequest对象

    2016-01-18 13:26

  • AJAX - 请求服务器

    AJAX - 请求服务器

    2016-01-17 16:00

  • 掌握AJAX之AJAX通讯技术简介

    掌握AJAX之AJAX通讯技术简介

    2016-01-15 11:26

网友点评
e