码迷,mamicode.com
首页 > 编程语言 > 详细

javascript 函数的定义与参数的有无

时间:2015-07-11 00:56:27      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:

一、函数定义

function fName(params){

  statements;

  return somevalue;//可以省略

}

注意事项:

1、参数可有,可无。不定义参数,在调用参数时,也可以传入参数;

例如:

 1 function add(){
 2     if(arguments.length==1){
 3         alert(arguments[0]);    
 4     }else if(arguments.length==2){
 5         alert(arguments[0] + arguments[1] );    
 6     }else{
 7         alert(arguments[0] + arguments[1] + arguments[2] );    
 8     }    
 9 }
10 add(1);
11 add(1,2);
12 add(1,2,3);
13 add(1,2,3,4);

2、1中用到的是javascript中的一个对象:参数数组对象arguments,利用长度属性进行判断和调用。同时,这是一个内置对象,不可new。

object Array arguments

arguments.length

argument[i]

3、函数不存在重载概念,但是可以用1中的方法实现重载的功能。1中的方法可以优化为以面的代码:

 1 function add(){
 2     var total=0;
 3     for(var i=0;i<arguments.length;i++){
 4         total+=arguments[i];
 5     }
 6     alert(total);
 7 }
 8 add(1);
 9 add(1,2);
10 add(1,2,3);
11 add(1,2,3,4);

4、函数可以有返回值,也可以没有返回值,定义时的区别只在一个return语句。

5、局部变量与全局变量

函数内定义的变量,如果加var就是局部变量,如果不加var会自动变成一个全局变量

 1 var x="x0";//全局变量
 2 y="y0";//全局变量
 3 function f(){
 4     var z="z1";//使用var,是局部变量,作用域是函数内,函数外无法调用 
 5     var x="x1";//使用var,是局部变量,虽然与全局变量x重名,但局部变量优先,也不会修改外部x的值
 6     y="y1";//自动全局变量,会修改外面的y值
 7     s="s1";//自动全局变量,全局可调用 
 8     for(var i=0;i<2;i++){
 9         
10     }
11     alert(x);//x1
12     alert(y);//y1
13     alert(i);//2,js没有块级作用域,即js中的作用域不是用{}来界定的,而是用function {}来界定的,这和java是不一样的
14 }
15 f();
16 alert(x);//x0,函数内的x是局部变量,不改变全局变量x的值
17 alert(y);//y1,在函数内调用的是全局变量y,值已经发生变化 
18 alert(typeof z);//undefined,作用域在函数内,无法在函数外调用 ,直接调用会发生错误
19 alert(s);//s1,全局变量

6、块级作用域与函数作用域

javascript 不是块级作用域,即不是用{}来界面scope,而是用function {}来界定scope,所以5中第13行,i的值在函数内部都是可见的;而第18行,z在函数外不可见。5中的函数f()等价与下面的函数:

 1 function f(){
 2     var i;
 3     var z="z1";//使用var,是局部变量,作用域是函数内,函数外无法调用 
 4     var x="x1";//使用var,是局部变量,虽然与全局变量x重名,但局部变量优先,也不会修改外部x的值
 5     y="y1";//自动全局变量,会修改外面的y值
 6     s="s1";//自动全局变量,全局可调用 
 7     for(i=0;i<2;i++){
 8         
 9     }
10     alert(x);//x1
11     alert(y);//y1
12     alert(i);//2,js没有块级作用域,即js中的作用域不是用{}来界定的,而是用function {}来界定的,这和java是不一样的
13 }

相关于java中的作用域提升。

再看下面一个例子:

 1 var x="x0";
 2 function f(){
 3     alert(x);//undefined,函数内的变量声明是整个函数内可网子 的,也就是说下面var x="x1"已经转化为
 4              //var x(上提到函数内部最上方)和x="x1"(原相对位置)两部分,此外x是一个已经声明的局部变量,但没有初始化
 5     alert(y);//undefined,理由同上
 6     alert(typeof(z));//不出结果,报错,错误原因为:错误的引用。因为下面的z没有使用var,会生成一个全局变量,
 7                       //但是此时还没有执行到该处,所以以时还是末声明的,改成alert(typeof(z)),结果为undefined。
 8     var x="x1";
 9     var y="y1";
10     z="z1";//声明一个全局变量
11     alert(x);//x1
12     alert(y);//y1
13     alert(z);//z1
14 }
15 f();

快12点了,先写到这里!

javascript 函数的定义与参数的有无

标签:

原文地址:http://www.cnblogs.com/yard39/p/4637746.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!