js 函数对象

函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深刻的了解;javascript

  javaScript中的函数不一样于其余的语言,每一个函数都是做为一个对象被维护和运行的,经过函数对象的性质,能够很方便的将一个函数赋值java

给一个变量或者将函数做为参数传递,咱们先来看看函数的使用语法:数组

 

function func1(...){...}模块化

var func2 = function(...){}
var func3 = function func4(...){...}函数

var func5 = new Function();spa

  

  这些都是声明函数的的正确语法。它们和其余语言中常见的函数或以前介绍的函数定义方式有着很大的区别。设计

那么在javascript中为何能这样写呢?所遵循的语法是什么呢?对象

 

  认识函数对象(Function Object)ip

  函数自己就是一个对象,能够用 function 关键字定义,并为每一个函数起一个函数名,经过函数名来调用。在字符串

javascript解释执行时,函数都是被维护为一个对象,这就是要介绍的函数对象(Function Object)了

  函数对象与其余用户定义的对象有着本质的区别,这一类对象称之为内部对象,例如日期对象(Date)、数组

对象(Array),字符串对象(String)......等等都属于内部对象。这些内置对象的构造器是由JavaScript自己所定义的:

经过执行new Array()这样的语句返回一个对象,JavaScript内部有一套机制来初始化返回的对象,而不是又用户指定对象

的构造方式。

 

  在JavaScript中,函数对象对应的类型是Function,正如数组对象对应的类型是Array,日期对象对应的类型是Date同样,

能够经过new Function()来建立一个函数对象,也能够经过function关键字来建立一个对象,为了便于理解,咱们比较函数

对象的建立和数组对象的建立,先看数组对象下面两行代码都是建立一个数组对象myArray:

如下是引用片断:
var myArray=[];  
//等价于  
var myArray=new Array();  
一样,下面的两段代码也都是建立一个函数myFunction:  
function myFunction(a,b){  
  return a+b;  
}  
//等价于  
var myFunction=new Function("a","b","return a+b");   

  经过和构造数组对象语句的比较,能够清楚的看到函数对象本质,前面介绍的函数声明是上述代码的第一种方式,而在解释器内部,当遇到这种语法时,就会自动构造一个Function对象,将函数做为一个内部的对象来存储和运行。从这里也能够看到,一个函数对象名称(函数变量)和一个普通变量名称具备一样的规范,均可以经过变量名来引用这个变量,可是函数变量名后面能够跟上括号和参数列表来进行函数调用。

 

用new Function()的形式来建立一个函数不常见,由于一个函数体一般会有多条语句,若是将它们以一个字符串的形式做为参数传递,代码的可读性差。下面介绍一下其使用语法:

如下是引用片断:
var funcName=new Function(p1,p2,...,pn,body);  

    参数的类型都是字符串,p1到pn表示所建立函数的参数名称列表,body表示所建立函数的函数体语句,funcName就是所建立函数的名称。能够不指定任何参数建立一个空函数,不指定funcName建立一个无名函数,固然那样的函数没有任何意义。

  须要注意的是,p1到pn是参数名称的列表,即p1不只能表明一个参数,它也能够是一个逗号隔开的参数列表,例以下面的定义是等价的:

如下是引用片断:
new Function("a", "b", "c", "return a+b+c")  
new Function("a, b, c", "return a+b+c")  
new Function("a,b", "c", "return a+b+c")  

  JavaScript引入Function类型并提供new Function()这样的语法是由于函数对象添加属性和方法就必须借助于Function这个类型。

  函数的本质是一个内部对象,由JavaScript解释器决定其运行方式。经过上述代码建立的函数,在程序中可使用函数名进行调用。本节开头列出的函数定义问题也获得了解释。注意可直接在函数声明后面加上括号就表示建立完成后当即进行函数调用,例如:

如下是引用片断:
var i=function (a,b){  
  return a+b;  
}(1,2);  
alert(i);   

  这段代码会显示变量i的值等于3。i是表示返回的值,而不是建立的函数,由于括号“(”比等号“=”有更高的优先级。这样的代码可能并不经常使用,但当用户想在很长的代码段中进行模块化设计或者想避免命名冲突,这是一个不错的解决办法。

 

须要注意的是,尽管下面两种建立函数的方法是等价的:如下是引用片断:function funcName(){    //函数体  }  //等价于  var funcName=function(){    //函数体  }     但前面一种方式建立的是有名函数,然后面是建立了一个无名函数,只是让一个变量指向了这个无名函数。在使用上仅有一点区别,就是:对于有名函数,它能够出如今调用以后再定义;而对于无名函数,它必须是在调用以前就已经定义。例如:如下是引用片断:<script language="JavaScript" type="text/javascript">  <!--  func();  var func=function(){    alert(1)  }  //-->  </script>     这段语句将产生func未定义的错误,而:如下是引用片断:<script language="JavaScript" type="text/javascript">  <!--  func();  function func(){    alert(1)  }  //-->  </script>     则可以正确执行,下面的语句也能正确执行:如下是引用片断:<script language="JavaScript" type="text/javascript">  <!--  func();  var someFunc=function func(){    alert(1)  }  //-->  </script>     因而可知,尽管JavaScript是一门解释型的语言,但它会在函数调用时,检查整个代码中是否存在相应的函数定义,这个函数名只有是经过function funcName()形式定义的才会有效,而不能是匿名函数。

相关文章
相关标签/搜索