搞懂JavaScript全局变量与局部变量,看这篇文章就够了

举报
AlbertYang 发表于 2021/02/05 00:12:45 2021/02/05
【摘要】 目录 1.什么是全局变量和局部变量 2.全局变量和局部变量的声明 2.1 全局变量的声明 2.2 局部变量的声明  3.全局变量和局部变量一些常见问题    3.1全局变量跟局部变量重名 3.2 零散变量的问题 3.3. 变量释放问题 总结:   1.什么是全局变量和局部变量 全局变量:常常...

目录

1.什么是全局变量和局部变量

2.全局变量和局部变量的声明

2.1 全局变量的声明

2.2 局部变量的声明

 3.全局变量和局部变量一些常见问题

   3.1全局变量跟局部变量重名

3.2 零散变量的问题

3.3. 变量释放问题

总结:


 

1.什么是全局变量和局部变量

全局变量:常常定义在函数外部,拥有全局作用域,即在 JavaScript 代码的任何地方都可以访问。

局部变量:定义在函数内部,只能在函数中使用的变量,作用范围是从函数开始到结尾,即在{}里。

在函数内声明的变量只在函数体内有定义,即为局部变量,其作用域是局部性的。需要注意的是,在函数体内声明局部变量时,如果不使用 var 关键字,则将声明全局变量。


  
  1. <script>
  2. var str1 = "hello1"; //定义一个全局变量
  3. function a() {
  4. var str2 = "hello2"; //定义一个局部变量
  5. str3 = "hello3"; //定义一个全局变量
  6. }
  7. </script>

 此处str1和str3是全局变量,str2为局部变量。

2.全局变量和局部变量的声明

2.1 全局变量的声明

在js中全局变量声明方式分为显示声明和隐式声明

第一种声明方式:使用var关键字+变量名在函数外部声明就是全局变量,例如:

var bianliang = "全局变量";
 

第二种声明方式:没有使用var关键字声明,直接给变量名赋值,不管是在函数内部还是外部都是全局变量,例如:


  
  1. <script>
  2. text = "全局变量";
  3. function bl() {
  4. text1 = "我也是全局变量";
  5. var text2 = "我是局部变量";
  6. console.log(text2); //局部变量只能在函数中使用
  7. }
  8. bl() //结果:我是局部变量
  9. console.log(text); //结果:全局变量
  10. console.log(text1); //结果:我也是全局变量
  11. //console.log(text2); //局部变量,在函数外使用会报错
  12. </script>

第三种声明方式: 使用window全局对象来声明,全局对象的属性对应也是全局变量,例如:


  
  1. window.test3 = 'window全局对象声明全局变量';
  2. console.log(test3);//结果:window全局对象声明全局变量

 

2.2 局部变量的声明

声明局部变量一定要使用var关键字,使用var关键字声明变量时,变量会自动添加到距离最近的可用环境中。如果没有写var, 变量就会暴露在全局上下文中, 成为全局变量。如果变量在未声明的情况下被初始化,该变量会自动添加到全局环境。


  
  1. <script>
  2. function bl() {
  3. text1 = "我也是全局变量";//没有使用var 为全局变量
  4. var text2 = "我是局部变量";
  5. console.log(text2); //局部变量只能在函数中使用
  6. }
  7. </script>

 3.全局变量和局部变量一些常见问题

   3.1全局变量跟局部变量重名

当全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的scope,当离开局部变量的scope后,又重回到全局变量的scope。


  
  1. <script>
  2. var str = "我是全局变量";
  3. function b() {
  4. var str = "我是局部变量";
  5. console.log(str); //结果:我是局部变量
  6. }
  7. b();
  8. console.log(str);//结果:我是全局变量
  9. </script>

 当全局变量遇上局部变量时,怎样使用全局变量呢?用window.globalVariableName。


  
  1. <script>
  2. var a = 1; //全局变量
  3. ! function b() {
  4. var a = 2; //局部变量a在这行定义
  5. console.log(window.a); //a为1,这里的a是全局变量哦!
  6. console.log(a); //a为2,这里的a是局部变量哦!
  7. }()
  8. console.log(a); //a为1,这里并不在function b scope内,a的值为全局变量的值
  9. </script>

3.2 零散变量的问题

Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定变量的作用域。所以Javascript允许在函数的任意地方声明变量,无论在哪里声明,效果都等同于在函数顶部进行声明。怎么理解呢?看下面一个例子:


  
  1. <script>
  2. var str = "我是全局变量";
  3. ! function b() {
  4. console.log(str); //结果:undefined
  5. var str = "我是局部变量";
  6. console.log(str); //结果:我是局部变量
  7. }()
  8. </script>

为什么不是: 我是全局变量 和 我是局部变量?
原因很简单:对JavaScript而言,只要变量是在同一个范围(函数)里,就视为已经声明,哪怕是在变量声明前就使用。上面的代码相当于:


  
  1. <script>
  2. var str = "我是全局变量";
  3. ! function b() {
  4. var str; //系统自动赋值为 str = undefined
  5. console.log(str); //结果:undefined
  6. var str = "我是局部变量";
  7. console.log(str); //结果:我是局部变量
  8. }()
  9. </script>

3.3. 变量释放问题

请看下面的代码:


  
  1. <script>
  2. var a = "hello"; //全局变量
  3. window.b = "word"; //全局变量
  4. delete a;
  5. delete b;
  6. console.log(typeof a); //结果:string
  7. console.log(typeof b); //结果:undefined
  8. ! function b() {
  9. var c = 1; //局部变量
  10. d = 2; //全局变量
  11. delete c;
  12. delete d;
  13. console.log(typeof c); //结果:number
  14. console.log(typeof d); //结果:undefined
  15. }()
  16. </script>

结论:

  • 使用 var 创建的变量不能使用 delete 释放内存。
  • 不使用 var 创建的变量可以使用 delete 释放内存。

总结:

1.在过程体内(包括方法function(){},对象Object o={})内的对象)加var保留字则为局部变量,其他情况下都是全局变量(无论是否使用var。不进行声明而直接使用全局变量会报错(可以隐式声明),而局部变量先使用后声明则不会报错,只是值为undefined。

2.全局变量跟局部变量重名时,局部变量的范围会覆盖掉全局变量的范围,当离开局部变量的范围后,又重回到全局变量的范围。(若想指定是全局变量可以使用 window.globalVariableName。

3.Javascript允许在函数的任意地方声明变量,无论在哪里声明,效果都等同于在函数顶部进行声明

4.使用 var 创建的变量不能使用 delete 释放内存,其他方式创建的变量可以使用 delete 释放内存。

 

一般来说全局变量所带来的 bug 问题非常多,所以最好尽量少用全局变量。另外,声明变量最好带 var, 不应使用带 var 的链式赋值,在函数体内定义变量时,最好把变量声明放在顶部,防止出现变量没有被定义就被使用的逻辑错误。

文章来源: albertyang.blog.csdn.net,作者:Albert Yang,版权归原作者所有,如需转载,请联系作者。

原文链接:albertyang.blog.csdn.net/article/details/106946100

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。