标签:
一、函数定义
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点了,先写到这里!
标签:
原文地址:http://www.cnblogs.com/yard39/p/4637746.html