函数的作用和定义那一部分还有一些小问题,我去把他写完
写完了
我们来看一个问题:
下面是我们要讨论的问题的例子代码
<script>
var msg = "全局变量";
function square (x,y )
{
var sum;
sum = x+y;
return sum;
}
function show()
{
var msg = "局部变量";
alert(msg);
}
var sum
alert("结果等于"+sum);
sum = square(2,3);
alert("结果等于"+sum);
alert(msg);
show( );
</script>
在这段程序里
var sum
alert("结果等于"+sum);这里的sum的值是多少?
程序按顺序从上往下执行,会先执行var msg = "全局变量";,我们说过了函数是不会被
浏览器自动解释执行的除非有地方调用他们,然后程序再执行
var sum
alert("结果等于"+sum);
我们声明了这个sum变量,但是我们还没有给他任何的值,所以这个时候这个sum
的值为空,也就是说这个时候这个sum是undefined
var sum
alert("结果等于"+sum);
{
var sum;
sum = x+y;
return sum;
}
这两个sum变量没有任何的关系,
一个函数当中定义的变量只能在这个函数当中使用,他对于这个函数之外的其他代码
是不可见的,也就是说在
function square (x,y )
{
var sum;
sum = x+y;
return sum;
}
这个函数之外的其他地方不能访问这个函数里面所定义(var sum)的sum变量,也
就是说这两个sum变量没有任何的关系,他们各司其职,一个只能在函数里面用,当
函数结束时这个函数里面声明的变量就没有了用处,
一个是函数里面外面都可以用的
var sum
alert("结果等于"+sum);
因为这个sum是在主程序里的,而不是在函数里,在主程序里声名的变量他的作用
范围是这整个的所有的程序,但是当他碰到函数里面自己定义声明的和他重名的变量
时,因
为函数是可以独立于主程序之外存在的,所以一旦碰到了主程序定义的变量和函数内部
自己定义的变量重名的时候,那么函数内部自己声明的变量就会覆盖掉主程序声明的
变量,函数将会使用函数内部所声明的变量,当函数结束时这个函数里面声明的变量就
没有了用处
根据变量作用的范围,javascript中的变量又可以分为全局变量和局部变量
全局变量是在所有的函数外边所声明的变量,比如说上面代码中的
var msg = "全局变量";这就是程序定义的一个全局变量,他是在所有的函数外边定义的
全局变量的作用范围是他后面的所有的脚本代码,包括函数中的代码,也包括这段
javascript代码之后的其他的javascript代码,也就是
<script>
var msg = "全局变量"; //全局变量的作用范围是这个变量声明语句后面的所有的脚本
//代码
function square (x,y )
{
var sum;
sum = x+y;
return sum;
}
function show()
{
var msg = "局部变量";
alert(msg);
}
var sum
alert("结果等于"+sum);
sum = square(2,3);
alert("结果等于"+sum);
alert(msg);
show( );
</script>
还有这段代码后面的所有的其他的javascript代码
局部变量是声明在函数里面的变量,局部变量只对函数里面的那条变量声明语句后面
的代码有效
{
var sum; //这里的sum是局部变量,他的作用范围就是这个函数里面的这条
//变量声明语句后面的代码,也就是下面这两句
sum = x+y;
return sum;
}
{
var msg = "局部变量"; //这里的msg是局部变量,他的作用范围是这个函数里面
//的这个变量声名语句var msg = "局部变量"; 之后的代码
alert(msg); //也就是这一句
}
哎呀过八点了春春对不起
局部变量对于函数外面的脚本代码是不可见的,比如我们上面举的例子,函数内部声明
了一个局部变量sum,在函数外面也声明了一个与局部变量相同名称的变量sum,这
两个sum没有任何的关系,函数中声明的这个局部变量sum对于函数之外的代码来说
是看不见的,只有这个函数自己才可以看得见和用得着这个局部变量
在函数当中如果遇到与全局变量同名的局部变量的时候,那么在这个函数里面,这个
局部变量将会覆盖掉和他同名的全局变量,所以在这个函数中这个局部变量之后的函数
代码使用的都是这个函数内部所定义的这个局部变量而不是全局变量,比如说在我们
这篇文章最开头的那段例子代码中
<script>
var msg = "全局变量";
function square (x,y )
{
var sum;
sum = x+y;
return sum;
}
function show()
{
var msg = "局部变量";
alert(msg);
}
var sum
alert("结果等于"+sum);
sum = square(2,3);
alert("结果等于"+sum);
alert(msg);
show( );
</script>
在这段代码中
var msg = "全局变量"; //在函数之外有一个变量msg,因为可以直接被浏览器解释运行,
//所以是全局变量
function show()
{
var msg = "局部变量"; //在show函数里面有一个变量msg,因为不能直接被
//浏览器解释运行,需要主程序调用他才能运行,所以
//这是个局部变量
alert(msg);
}
很显然这两个变量同名,而局部变量对于函数之外的主程序代码来说是不可见的,所以
程序按顺序先运行var msg = "全局变量"; ,然后一直往下走,就碰到了
function show()
{
var msg = "局部变量";
alert(msg);
}
由于这个函数已经有了自己的局部变量,这个局部变量只对这个函数中这个局部变量的
声明语句之后的语句起作用,在这里也就是说对 alert(msg);起作用,
而对于这个函数之外的热河代码都是不可见的,整个程序将会把这两个相同名称的变量
堪称是两个毫无关系的不一样的变量,所以程序先从头运行var msg = "全局变量";,
然后继续按顺序往下走,当碰到
function show()
{
var msg = "局部变量";
alert(msg);
}
的时候由于碰到了var msg = "局部变量" ,尽管变量名相同,但是主程序就会认为这是
两个不同的变量,毫无关系的变量,所以主程序就会跳过这个函数而继续往下执行
然后程序就先碰到了alert(msg);弹出一个对话框,显示msg,我们说过了函数内部定义
的变量在函数外边是看不见的,所以这个时候这个msg指的就是var msg = "全局变量";
所以程序将弹出一个对话框,显示“全局变量”然后程序接着往下运行,然后就碰到了
show();在没有程序调用函数时函数不会自动执行,这个时候有程序调用他了
他就会执行,因为这个show函数没有任何的参数,所以在调用这个函数的时候只需要
用函数名()的格式就可以了
function show()
{
var msg = "局部变量";
alert(msg);
}
定义了一个新的msg变量,让他等于“局部变量”,弹出一个对话框,显示:局部变量
OK了
下面我们来看一段简单的代码
<script>
var x = "fff";
var x = "aaa"; //在这里程序不会把x当成另一个新的变量来处理,没有原因,这是规定
//但是可以举一反三
alert(x);
</script>
这段代码运行的结果是会弹出一个对话框,显示“aaa”;
我们再来看下面这段代码
<script>
var x = "aaa";
function square ()
{
x = "ddd";
alert(x);
var x = "fff";
alert(x);
}
square();
</script>
弹出两个对话框,显示“ddd”和“fff”,我们来分析一下
程序先执行var x = "aaa";然后继续往下走,碰到函数,但是没有找到调用他的语句
所以这个时候程序只是检查函数中有没有错误的语法,有没有写错什么,但是程序不会
执行这个函数中的任何代码,当检查完以后,继续走,然后碰到square();这个没有参数
的函数,然后程序就会执行函数square当中的代码
x = "ddd";
alert(x);
程序带着var x = "aaa";运行到函数中的上面两行,x = "ddd";把x修改成了ddd
然后显示x,这是程序要弹出的第一个对话框,注意:在这里,我们没有在x前面写var,
意思是说我们用的还是这个全局变量x,而没有用这个函数内部自己定义的局部变量,
然后程序就碰到下面两句
var x = "fff";
alert(x);
这里有个变量声明语句var,在函数中声明的变量是局部变量,在这里这个局部变量
的;名称也是x,这个x和那个全局变量var x = "aaa";是没有热和关系的,也就是说是两
个变量,两个完全不一样的变量,局部变量x会覆盖掉全局变量x,所以在这个时候
全局变量不会参与这两行代码的执行,而是函数内部的局部变量在运行,
这两句的执行效果就是说:又出现了一个变量x,他的名称是fff
弹出一个对话框,显示fff
这段脚本的运行结果是会弹出两个对话框,分别显示ddd和fff
由此我们也可以知道
{
x = "ddd";
alert(x);
var x = "fff"; //这是局部变量,这一条语句就是这个变量的声明语句
alert(x);
}
局部变量只对在函数中,在那条变量声明语句之后的代码起作用,但是对于在函数中
声明这个变量的声明语句之前的代码都是不起作用的,因为javascript脚本是按照顺序执
行的,先运行
x = "ddd";
alert(x);
再运行
var x = "fff"; //这一句对上面那两行加下划线的语句是无效的
alert(x);
我们来看一个例子:
<script>
alert(x);
var x = "fff";
alert(x);
</script>
这段代码显示的结果是:弹出两个对话框,分别显示undefined和fff
因为程序是按照顺序执行的,所以程序会先运行alert(x);程序已经知道x是一个变量,可
是x的值是什么呢是多少呢,程序自己
也不知道,因为这个时候这个变量没有被赋值,所以程序将显示undefined,然后程序
继续运行,运行到var x = "fff";然后再运行alert(x);这个时候就会弹出“fff”对话框
(程序已经知道x是一个变量,为什么呢?
javascript中的变量有的时候在不声明的时候也可以直接使用,就像这里,我们没有声
明x,但是我们仍可以直接使用(alert(x));但是有的情况则必须要先声明变量然后
才能使用,具体是哪些情况要声明哪些情况可以不用声明这个一时半会还真的不好找,
我的观点:对变量必须先作声明然后再使用)