javascript函数

来源:互联网 发布:博途软件下载 编辑:程序博客网 时间:2024/06/05 11:44

函数是指定义一次却可以调用多次或是运行多次的javascript代码段。要学好javascript,弄清楚函数是必要的。

学习函数必须要弄清楚以下几点:
1. 声明方法
2. 作用域
3. 函数参数
4. 函数调用

 

一. 声明

一般函数有三种声明方法,如下所示:

 

[javascript] view plaincopy
  1. <mce:script type="text/javascript"><!--  
  2. function f1(x,y)  
  3. {  
  4.     return x*y;  
  5. }  
  6. var f2 = function(x,y)  
  7. {  
  8.     return x*y;  
  9. }  
  10. var f3 = new Function("x""y""return x*y; ");  
  11. // --></mce:script>  
 

 

前面两种应该是经常见到的,最后一种声明方式特殊一点,他接受n个参数(n>1),前n-1个参数是新函数的参数,最后一个参数是函数体。这种声明方式可以允许用户根据字符串动态创建一个函数,但每new Function一次就会动态编译并生成一个新的对象,如果调用了十次new Function,就生成了十个新的对象,如果放在经常调用的地方或是循环体内效率就低了。

 

二.函数的作用域

对于函数来说,他的作用域是在定义的时候就决定的,而不是在他调用的时候决定。但是用new Function声明的函数,他的作用域是全局,相当于是在全局定义的函数。关于具体的作用域知识,可以参考我之前写的文章:Javascript作用域浅析 。

 

三,函数的参数。

虽然函数声明时定义了参数列表,但这个参数列表其实只是提供了对应参数的一个快速引用而已。函数是可以用任意多的参数调用的。下面的函数f1跟注释掉的函数f1定义是一样的函数:

 

 

[javascript] view plaincopy
  1. <mce:script type="text/javascript"><!--  
  2. function f1(x,y)  
  3. {  
  4.     return x*y;  
  5. }  
  6. /* 
  7. function f1() 
  8. { 
  9.     x = arguments[0]; 
  10.     y = arguments[1]; 
  11.     return x*y; 
  12. } 
  13. */  
  14. // --></mce:script>  
 


在上面,我们看到了一个特殊的对象: arguments,注意,arguments并不是数组,它只是一个对象。arguments里面存贮了实际的调用参数,它和参数列表里面的参数是维护同一份数据的。下面的例子有助于理解。

 

[javascript] view plaincopy
  1. <mce:script type="text/javascript"><!--  
  2. function f1(x,y)  
  3. {  
  4.     arguments[0] = 1;  
  5.     return x*y;  
  6. }  
  7. alert(f1(3,5)); //will display 5  
  8. // --></mce:script>  
 


上面的例子中,我们修改了arguments[0],同时参数列表里面的x的值也改变了。arguments还有两个属性,一个是length,指出参数的个数,还有一个属性callee,指向函数。下面我们用callee来计算阶乘:

 

[javascript] view plaincopy
  1. <mce:script type="text/javascript"><!--  
  2. var result = (function(x)  
  3. {  
  4.     if(x <=1) return 1;  
  5.     return x* arguments.callee(x-1);  
  6. })(3);     
  7. alert(result);//will display 6  
  8. // --></mce:script>  
 


 

四.函数的调用

函数可以作为数据进行传递,但函数的作用域是在定义时候决定的,那么函数由谁调用有没有什么不同呢?答案是有的,差别就在于 this关键字。每个函数内部,都可以用this引用调用它的对象,读取或是修改对象的属性。所有没有声明调用对象的函数,默认都是由window调用,我们看看下面的例子:

 

[javascript] view plaincopy
  1. <mce:script type="text/javascript"><!--  
  2. var name= "window";  
  3. var person = {  
  4.     name : "person",  
  5.     f1 : function()  
  6.         {  
  7.             return  this.name;  
  8.         }  
  9. }  
  10. var f2 = person.f1;  
  11. alert(f2());   //will display window  
  12. alert(window.f2());  //will display window  
  13. alert(person.f1());  //will display person  
  14. alert( person.f1.call(window) ); //will display window  
  15. alert( person.f1.call(person) ); //will display person  
  16. alert( person.f1.apply(window) ); //will display window  
  17. // --></mce:script>  
 

 

在上面,我们看到了this关键字指向的对象就是调用他的对象。其中,我们还看到了另外两种调用的方式:call, apply。这是函数的两个属性,可以用来调用函数,第一个参数都是指调用对象,而对于调用函数的参数,call是一个一个罗列,如 .call(obj, x, y),而apply是使用数组,如 .apply(obj, [x, y]) 。

 

到这里我们可以知道:

函数的作用域是定义时候确定的,是调用无关的。
函数是实现特定功能的代码段,由谁调用是定义无关的。比如A对象可以调用B对象内定义的方法。例如:我们可以用随便一个对象对用Array定义的方法。

 

[javascript] view plaincopy
  1. <mce:script type="text/javascript"><!--  
  2. var p = {  
  3.     length : 0  
  4. }  
  5. Array.prototype.push.apply( p, [3, 4, 5] );  
  6. alert(p.length); // will dispay 3  
  7. alert(p[1]);    //will dispay 4  
  8. // --></mce:script>  
 

 

最后,我们再来看看关于setTimeout()的调用。setTimeout函数是系统在window对象下直接初值化的一个函数,他并没有 call属性,所以只能用setTimeout()或是window. setTimeout()调用。它接受两个参数,第一个是运行的代码,它可以是字符串,也可以是一个函数。第二个参数是间隔时间,指多少时间后运行代码,以毫秒为单位。
如果第一个参数是字符串,javascript就会默认是javascriipt代码段,到时间后会在全局作用域下运行改javascript代码。就是说里面的作用域是全局,调用对象是 window。
如果第一个参数是函数,那么函数的作用域是已经定了的,不过调用对象是window。
我们看一下下面的例子。

 

[c-sharp] view plaincopy
  1. <mce:script type="text/javascript"><!--  
  2. var name="window";  
  3. var p = {  
  4.     name: "obj",  
  5.     fun : function(){  
  6.         var name="local";  
  7.         alert(this.name);  //if p call it ,will display obj  
  8.         setTimeout("alert(name + ' and ' + this.name);", 1000); //all will display "window and windows"  
  9.           
  10.         setTimeout(function(){  
  11.             alert(name);   //will display local  
  12.             alert(this.name);   //will display window  
  13.         }, 2000);  
  14.     }  
  15. }  
  16. p.fun();  
  17. // --></mce:script>  
 

 

setInterval与setTimeout的区别在于setTimeout是只执行一次,而setInterval是间隔多少时间就执行一次,单是函数调用以及作用域的问题他们是一致的。


本文转自:http://blog.csdn.net/hzrui/article/details/3951289

原创粉丝点击