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

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

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

<script>var str1 = "hello1"; //定义一个全局变量function a() {var str2 = "hello2"; //定义一个局部变量str3 = "hello3"; //定义一个全局变量}
</script>

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

2.全局变量和局部变量的声明
2.1 全局变量的声明
在js中全局变量声明方式分为显式声明和隐式声明。

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

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

<script>text = "全局变量";function bl() {text1 = "我也是全局变量";var text2 = "我是局部变量";console.log(text2); //局部变量只能在函数中使用}bl() //结果:我是局部变量console.log(text); //结果:全局变量console.log(text1); //结果:我也是全局变量//console.log(text2); //局部变量,在函数外使用会报错
</script>

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

window.test3 = 'window全局对象声明全局变量';
 
console.log(test3);//结果:window全局对象声明全局变量
2.2 局部变量的声明
声明局部变量一定要使用var关键字,使用var关键字声明变量时,变量会自动添加到距离最近的可用环境中。如果没有写var, 变量就会暴露在全局上下文中, 成为全局变量。如果变量在未声明的情况下被初始化,该变量会自动添加到全局环境。

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

3.全局变量和局部变量一些常见问题
 3.1全局变量跟局部变量重名
当全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的scope,当离开局部变量的scope后,又重回到全局变量的scope。

<script>var str = "我是全局变量";function b() {var str = "我是局部变量";console.log(str); //结果:我是局部变量}b();console.log(str);//结果:我是全局变量
</script>

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

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

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

<script>var str = "我是全局变量";! function b() {console.log(str); //结果:undefinedvar str = "我是局部变量";console.log(str); //结果:我是局部变量}()
</script>

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

<script>var str = "我是全局变量";! function b() {var str; //系统自动赋值为 str = undefinedconsole.log(str); //结果:undefinedvar str = "我是局部变量";console.log(str); //结果:我是局部变量}()
</script>

3.3. 变量释放问题
请看下面的代码:

<script>var a = "hello"; //全局变量window.b = "word"; //全局变量delete a;delete b;console.log(typeof a); //结果:stringconsole.log(typeof b); //结果:undefined! function b() {var c = 1; //局部变量d = 2; //全局变量delete c;delete d;console.log(typeof c); //结果:numberconsole.log(typeof d); //结果:undefined}()
</script>

结论:

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

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

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

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

一般来说全局变量所带来的 bug 问题非常多,所以最好尽量少用全局变量。另外,声明变量最好带 var, 不应使用带 var 的链式赋值,在函数体内定义变量时,最好把变量声明放在顶部,防止出现变量没有被定义就被使用的逻辑错误。
————————————————
版权声明:本文为CSDN博主「是欢欢啊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bznhlhh/article/details/118600660

JS - 全局变量 局部变量相关推荐

  1. js全局变量-局部变量

    在全局作用域下声明的变量叫做全局变量(在函数外部定义的变量) 1.全局变量在代码的任何位置都可以使用 2.在全局作用域下var声明的变量 是全局变量 3.特殊情况下,在函数内不使用的var声明的变量也 ...

  2. php全局变量的关键字,PHP变量作用域(全局变量局部变量)globalstatic关键字用法实例分析...

    本文实例讲述了PHP变量作用域(全局变量&局部变量)&global&static关键字用法.分享给大家供大家参考,具体如下: 我们知道,变量呢,其实就相当于我们用来储存信息的容 ...

  3. 全局变量局部变量ScriptCase中的全局变量、局部变量

    工作之余抽点时间出来写写博文,希望对新接触的朋友有帮助.今天在这里和大家一起学习一下全局变量局部变量 在做一套应用的时候,有时候须要用到全局变量,比如:登录胜利后就将用户名保存上去,然后在每个页面里都 ...

  4. 解决ajax无法给js全局变量赋值的问题

    解决ajax无法给js全局变量赋值的问题 参考文章: (1)解决ajax无法给js全局变量赋值的问题 (2)https://www.cnblogs.com/zealousness/p/8757950. ...

  5. js全局变量污染问题

    js全局变量污染的产生场景 js中全局变量污染的场景,当代码非常长,开发周期长,如果不想办法去解决或者防止全局变量污染的问题,就会造成二次赋值同一个之前定义过的变量.(由于项目开发周期过长你又不记得之 ...

  6. js全局变量和局部变量名称一样_微信小程序的全局变量、页面变量,你真的掌握了?...

    开发微信小程序时,遇到的坑挺多的,别的不说,单是变量的应用,就够你折腾一阵子的了,可能,或许是我不熟悉的缘故吧? 1 如果你认为你很熟悉的话,那你猜一下,下面的变量-userInfo,是属于全局变量, ...

  7. js 中定义的 全局变量,局部变量

    关于变量和参数问题: var a = 2; //全局变量function func() {var a = 1; //局部变量a = 2; //全局变量} 函数外面定义的变量是全局变量,函数内可以直接使 ...

  8. js全局变量和局部变量

    1 <script> 2 var i = 'yuanjianhang'; 3 function myloveName() { 4 alert(i); 5 var i = 'guanxi'; ...

  9. JS 全局变量、局部变量(与其他语言不太一样)

    局部 // 此处不能调用 carName 变量 function myFunction() {var carName = "Volvo";// 函数内可调用 carName 变量 ...

最新文章

  1. HDU 4300 Clairewd’s message
  2. Callable、Future阻塞队列阻塞栈
  3. tf.clip_by_value
  4. win10自启动文件夹目录
  5. Proxy 补充学习笔记
  6. java web过滤器
  7. jquery-演练-表格的模态框新增与点击删除功能
  8. 【NB-IoT模块显示屏逻辑显示】
  9. java script 延时_javascript 延时执行函数
  10. vue 图片放大查看器
  11. VC编程获取和修改环境变量,不重启系统即时生效
  12. Aptana Studio3的安装问题
  13. 插入外部dwg文件,避免外部参照
  14. Codeforces Round #670 (Div. 2) C D E
  15. 计算机策略编辑器,组策略及组策略编辑器基础知识
  16. 詹姆斯·西蒙斯-数学,常识和运气
  17. PHP采集-数据采集PHP采集器
  18. Scaled-YOLOv4 简单学习笔记
  19. 目标检测入门之(二)综述(下)
  20. 纳芯微电子科创板上市:市值262亿 深创投与小米是股东

热门文章

  1. YCM安装以及遇到的坑
  2. oppo手机删了android怎么办,oppo手机删除的照片如何恢复【恢复方法】
  3. 几个比较好用的Node.js插件
  4. node egg APP支付宝支付
  5. 关于钓鱼攻击和防范这些事
  6. 华科与东北大学计算机专业,华科的计算机专业在全国怎么样
  7. 这就是OPPOr11为什么要出定制版的原因,粉丝们有福利了
  8. python炫酷烟花表白源代码-python实现浪漫的烟花秀
  9. java_05手机里练习
  10. 猿设计14——真电商之运费的事情你了解吗?