注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

我的博客

学如逆水行舟,不进则退!

 
 
 

日志

 
 
关于我

我崇拜伟人,但我从不追逐伟人,因为自知没有那么开阔的步伐!

网易考拉推荐

深入javascript的函数  

2007-07-23 16:18:42|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1、函数对象的理解:javascript中每个函数都是作为一个对象被维护和运行的,通过函数对象的性质,可以方便的将函数复制给变量或者作为参数传递。表面上,我们总是在根据函数名对函数进行调用,而在javascript解释执行的时候,实际上每个函数都是被维护为一个对象的,即函数对象。

内部对象(如Date,Array---)与用户定义的函数对象有区别,它们的构造器是由javascript本身所定义的,通过new Date()一类的语句返回一个对象,javascript内部有一套机制来初始化返回的对象,不同于用户指定构造函数的对象构造方式;

函数对象的类型是Function,可以通过new Function()创建一个函数对象,当然也可以通过function关键字创建一个对象。                                function test(1,b){  return a+b; }                       

                                        var test = new Function('a','b','return a+b');     

以上两行代码是等价的,都是创建了函数test;第一种方式(函数申明的方式)在解释器内部,会自动构造一个Function对象,将函数作为内部的对象来存储和运行;

new Founction(p1,p2,---,pn,body)语法:var functionName 指定函数名,没有则创建一个无名函数;参数类型都是字符串,p1---pn是参数名称列表,p1---pn也可以是逗号分割的参数列表;body是函数体语句;

直接在函数申明后加括号表示创建完成后立即进行函数调用;
                                     var object = function(a,b){ return a+b;}(1,2);   alert(object) ;//为3

Function是所有函数的基础,Object是所有对象的基础(包含函数对象);因此可以借助这一语法和关键字prototype给函数对象本身或所有对象定义一些通用的属性和方法;eg:
                                  Function.prototype.method=function(){ alert('function');}  
                                  function test(a,b){  return a+b;}   
                                  test.method();

                                  Object.prototype.method1 = function(){ alert(typeof(thid)); }
                                  var arr = new Array();
                                  function test(a,b){  return a+b;}   
                                  arr.method1();
                                  test.method1();

2、javascript函数的特性:在函数调用时,除指定的参数,还包括一个隐含参数----arguments(具有数组一样的访问特性,但不是一个数组对象)。 eg:   function test(a,b){
                                                       alert(a);alert(b);
                                                       for(var i=0; i<arguments.length; i++){  alert(arguments[i]);  }
                                                }
                                                test(1,2,3);             //代码运行一次打印1  2  1  2  3

arguments有一个属性callee,表示对函数本身的引用,这有利于无名函数的递归和封装性。eg:
                                                 var sum = function(n){
                                                      if(1==n) return 1;    else return  n+arguments.callee(n-1);
                                                 }
                                                 alert(sum(100));    //5500

javascript函数有一个属性length,它表示函数定义参数个数;

javascript定义了两个函数apply和call,用于将函数邦定到另一个对象上去运行;所有函数内部的this指针都将被赋值为thisArg对象,以达到将函数作为另一个对象的方法运行的目的。除了thisArg其他都是为Function对象传递的参数。
                                                  Function.prototype.apply(thisArg,arrArray);
                                                  Function.prototype.call(thisArg [,arg1[,arg2[,---]]]);

         eg:                                    function func1(){
                                                         this.p = 'func1--';
                                                         this.A = function(arg){  alert(this.p + arg};
                                                  }
                                                  function func2(){
                                                         this.p = 'func2--';
                                                         this.B = function(arg){  alert(this.p + arg};
                                                  }

                                                  var obj1 = new func1();                var obj2 = new func2();
                                                  obj1.A.apply(obj2,["by A"]);        obj1.A.call(obj2,["by A"]);             //显示func2-byA
                                                  obj2.B.apply(obj1,["by B"]);        obj2.B.call(obj1,["by B"]);               //显示func1-byB


           

  评论这张
 
阅读(357)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017