JS全局变量和局部变量
来源:互联网 发布:js 99乘法表的思路 编辑:程序博客网 时间:2024/06/05 10:46
最近在学习JS时,发现对JS的全局变量和局部变量理解不够深入,特此做一下总结:
一 当局部变量和全局变量重名时,局部变量会覆盖全局变量.当离开局部变量的scope后,又重回到全局变量的scope,而当全局变量遇上局部变量时,怎样使用全局变量呢?用window.globalVariableName。
二 JS变量的scope是根据方法块来划分的(也就是说以function的一对大括号{ }来划分)是function块,而for、while、if块并不是作用域的划分标准,
三 JS在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定实变量的作用域(变量提升),JS引擎的工作方式是,先获取所有被声明的变量再逐一执行,所有变量的声明语句都会被提升到当前代码块的头部,变量提升只会提升变量的声明,变量赋值不会提升.
下面举例说明:
<script type="text/javascript"> function test1(){ var a=2; alert(a); } test1();//2局部变量 alert(a);//1全局变量</script>
上面的例子很好理解,在test1()中局部变量a把全局变量a覆盖了,当执行完test1()后,又重回到全局变量的范围.
<script type="text/javascript"> var a=1; function test2(){ alert(a); var a=2; alert(a); } test2();//undefined 2 alert(a);//1</script>
为什么上面的例子结果是这样的呢?因为JS在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),所以在执行test1()之前,局部变量a已经声明过了,在第五行声明的,注意虽然第五行同时也把2赋值给局部变量了,但是正如上面总结的那样,只是声明提前了,赋值并没有提前,所以a此时还是没有值,所以输出undefined,(注意这是声明了,没有赋值而已,所以程序不会出错,假如也没有声明,则程序会出现错误),第六行输出局部变量2,,第九行输出全局变量1.上面的程序等价于
<script type="text/javascript">function test2() { var a;//局部变量与全局变量重名时会覆盖全局变量,此时的a只有声明却未定义 alert(a);//所以执行alert值为undefined a = 2; alert(a); } test2(); alert(a);</script>
在看一个变量提升的例子
<script type="text/javascript">var a=1;function test3(){ alert(a); a=2; alert(a); var a; alert(a)}test3();//undefined 2 2alert(a);//1 </script>
刚才我们说了JS变量的scope是根据方法块来划分的(也就是说以function的一对大括号{ }来划分)是function块,而for、while、if块并不是作用域的划分标准,举个例子
<script type="text/javascript"> function test5(){ alert(i);//undefined for(var i=0;i<3;i++){ alert(i);//0 1 2 } alert(i);//3,注意,此时已经在for scope以外,但i的值仍然保留为3 if(true){ var j=0; alert(j);//0 } alert(j);//0,此时已经在if scope以外,但是j的值仍然保留为0 } test5(); alert(i);//error,原因是变量i未声明,导致脚本错误,程序到此结束! alert(j);//未执行 </script>
下面还有个好玩的现象
<script type="text/javascript"> function test6(){ a=100; } test6(); alert(a);//100,在函数作用域内 加var定义的变量是局部变量,不加var定义的就成了全局变量 </script>
<script type="text/javascript">var a=100;function test7(){ a=200; alert(a);//200}test7();alert(a);//200</script>
<script type="text/javascript">function test8(){ alert(a); var a="hello world";}test8();//undefinedalert("执行了......");//这句话执行了</script>
<script type="text/javascript">function test9(){ alert(a); a="hello world";}test9();//出错alert("未执行......");//这句话未执行</script>
原因是使用var 定义变量会提升变量声明,不适用var则不可以
- js全局变量和局部变量
- js全局变量和局部变量
- js 局部变量和全局变量
- js 全局变量和局部变量
- js局部变量和全局变量
- JS全局变量和局部变量
- JS全局变量和局部变量
- JS全局变量和局部变量
- JS-全局变量和局部变量
- js 局部变量和全局变量
- js全局变量和局部变量
- js局部变量/全局变量
- js局部变量 全局变量
- js---局部变量和全局变量(1)
- js---局部变量和全局变量(2)
- js---局部变量和全局变量(3)---实例
- js中的局部变量和全局变量
- js的全局变量和局部变量
- hdu 2444 二分图匹配 + dfs染色
- Java实现(12)——轻量级模式(FlyWeight Pattern)
- Javascript this理解
- JDK源码学习之String篇
- CentOS 7环境配置tomcat7开机启动
- JS全局变量和局部变量
- 企业网站打不开,自检步骤
- Mac:protobuf proto文件编译为Java文件
- eclipse快捷键、java继承、枚举相关
- 登陆注册的基础知识
- JAVA之小常识
- 字节对齐
- ERROR 1010 (HY000): Error dropping database (can't rmdir '.\qpweb', errno: 41) 删库失败问题的解决
- 算术运算符的使用注意