JS全局变量和局部变量
2016-12-17 10:35
453 查看
最近在学习JS时,发现对JS的全局变量和局部变量理解不够深入,特此做一下总结:
一 当局部变量和全局变量重名时,局部变量会覆盖全局变量.当离开局部变量的scope后,又重回到全局变量的scope,而当全局变量遇上局部变量时,怎样使用全局变量呢?用window.globalVariableName。
二 JS变量的scope是根据方法块来划分的(也就是说以function的一对大括号{ }来划分)是function块,而for、while、if块并不是作用域的划分标准,
三 JS在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定实变量的作用域(变量提升),JS引擎的工作方式是,先获取所有被声明的变量再逐一执行,所有变量的声明语句都会被提升到当前代码块的头部,变量提升只会提升变量的声明,变量赋值不会提升.
下面举例说明:
上面的例子很好理解,在test1()中局部变量a把全局变量a覆盖了,当执行完test1()后,又重回到全局变量的范围.
为什么上面的例子结果是这样的呢?因为JS在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),所以在执行test1()之前,局部变量a已经声明过了,在第五行声明的,注意虽然第五行同时也把2赋值给局部变量了,但是正如上面总结的那样,只是声明提前了,赋值并没有提前,所以a此时还是没
4000
有值,所以输出undefined,(注意这是声明了,没有赋值而已,所以程序不会出错,假如也没有声明,则程序会出现错误),第六行输出局部变量2,,第九行输出全局变量1.上面的程序等价于
在看一个变量提升的例子
刚才我们说了JS变量的scope是根据方法块来划分的(也就是说以function的一对大括号{ }来划分)是function块,而for、while、if块并不是作用域的划分标准,举个例子
下面还有个好玩的现象
原因是使用var 定义变量会提升变量声明,不适用var则不可以
一 当局部变量和全局变量重名时,局部变量会覆盖全局变量.当离开局部变量的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此时还是没
4000
有值,所以输出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 2 alert(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();//undefined alert("执行了......");//这句话执行了 </script>
<script type="text/javascript"> function test9(){ alert(a); a="hello world"; } test9();//出错 alert("未执行......");//这句话未执行 </script>
原因是使用var 定义变量会提升变量声明,不适用var则不可以
相关文章推荐
- Javascript:谈谈JS的全局变量跟局部变量
- JS中VAR的用处(局部变量要用var来声明,全局变量不加var)
- js中的局部变量和全局变量
- JS 全局变量 局部变量 与 hoisting
- js 全局变量和局部变量
- js中变量的声明,及全局变量和局部变量
- js的全局变量与局部变量
- JS-全局变量和局部变量
- JS中最经典的全局变量和局部变量问题
- js中的全局变量和局部变量
- js 局部变量和全局变量
- Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
- Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
- JS全局变量与局部变量的坑
- JS全局变量和局部变量最新解析
- JS全局变量和局部变量
- javascript基础笔记(八)之js的全局变量和局部变量
- js----全局变量和局部变量部分讲解
- JS中局部变量能修改全局变量吗?
- js的局部变量和全局变量,js中的标签,break标签