1.允许重复声明,导致变量被覆盖。看如下代码:

var a = 1;
function prinf(){console.log(a);
}var a = 2;prinf();

结果输出:

这里假设你var a = 2前面还有上万行代码,那么你调用prinf函数的时候,是想打印之前的a,但是你忘记之前声明的变量和几万行代码后面的a是同名的,导致后面声明的a覆盖了之前的a.
2.变量提升:闭包问题,怪异的数据访问.
看如下代码:

if(Math.random() > 0.5){var a = "abc";console.log(a);
}else{console.log(a);
}console.log(a);

输出结果:

由于变量提升问题,这段代码是不会报错的,但是逻辑是有问题的。
闭包问题:看如下代码

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body><div id="box"></div>  <script type="text/javascript">
//          在box里面加入10个按钮,点击每个按钮,打印按钮的编号var box = document.getElementById("box");for (var i = 1;i<=10; i++) {var btn = document.createElement("button");btn.innerHTML = "按钮"+i;box.appendChild(btn);}</script></body>
</html>

页面效果:
然后现在的需求是;点击按钮,输出按钮对应的编号


```html
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body><div id="box"></div>  <script type="text/javascript">
//          在box里面加入10个按钮,点击每个按钮,打印按钮的编号var box = document.getElementById("box");for (var i = 1;i<=10; i++) {var btn = document.createElement("button");btn.innerHTML = "按钮"+i;box.appendChild(btn);btn.onclick = function(){console.log(i);                  }}</script></body>
</html>

这里打印的结果都是11.我们期望的是打印对应的编号。由于点击事件里面访问的是外部变量,点击事件还没有发生,循环就已经结束了,所以打印的都是11.

解决办法:写很不优雅的代码:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body><div id="box"></div><script type="text/javascript">//            在box里面加入10个按钮,点击每个按钮,打印按钮的编号var box = document.getElementById("box");for(var i = 1; i <= 10; i++) {var btn = document.createElement("button");btn.innerHTML = "按钮" + i;box.appendChild(btn);(function(i) {btn.onclick = function() {console.log(i);}})(i)}</script></body>
</html>

3.全局变量挂载到全局对象:全局对象成员污染问题
先看如下代码:

<script type="text/javascript">var console = "打印";console.log(console);
</script>

输出结果:

这里console是全局上面的一个对象,但是我们声明的时候将其覆盖了。

4.以上就是js里面使用var声明变量的几个问题。

【JS里面使用var声明变量存在的三个问题】相关推荐

  1. 浅谈js中的var和function变量提升,var声明变量提升,块级作用域中的函数提升

    1.首先最常见的一种变量提升 console.log(a); //输出 undefinedvar a=10;console.log(a) // 输出 10 var 有提升的作用其实上面的代码会变成会变 ...

  2. JS红书宝--var,let和const声明变量

    var,let和const声明变量 var 声明 var声明作用域 function test() { var message = "hi"; // 局部变量 } test(); ...

  3. var let const声明变量的区别

    在js中定义变量的方式有三种,其中let和const关键字是来自ES6中的,下面将逐一介绍各个关键字声明变量的特点. var声明变量 var 是一个 JS关键字,用来声明变量( variable 变量 ...

  4. js 1 声明变量 数据类型

    1.vs新建步骤 文件--新建项目--web--空web应用程序--取名.位置.确定--此时软件会自动生成一个sln文件(解决方案),一解决方案下面可以有多个项目. 文件夹所在的位置 点击项目--右击 ...

  5. uniapp 获取到js文件var一个变量怎么获取到这个变量值_浅析Js中const,let,var的区别及作用域...

    理解:let变量的作用域只能在当前函数中 js中const,let,var的区别及作用域_lianzhang861的博客-CSDN博客​blog.csdn.net 全局作用域中,用 const 和 l ...

  6. php变量和js变量的区别吗,JS声明变量的3种方式和区别

    JavaScript 是弱类型语言,可以不需要声明变量而直接使用.这样虽然简单但不易发现变量名方面的错误,所以不建议这样做.通常的做法是在使用 JavaScript 变量前先声明变量.目前,JavaS ...

  7. 使用var、let、const声明变量

    一.使用var声明变量 1.使用方法 通过var关键字可以一次声明一个变量或者多个变量,同时可以为声明的变量赋初始值.但是变量的声明和初始值并不是在同一时间执行的,在执行初始值之前这些声明的变量的值为 ...

  8. javascript 声明变量var、let、const详解及示例

    1. var.let.const概述 ES6发布前,Javascript只能通过var声明变量的方式,常量.块级变量.函数变量这些概念的差别都不能很好的体现出来,于此同时,加入你要使用或者提供一个ap ...

  9. 详解var、let、const关键词声明变量的区别,以及变量提升、块级作用域的认识等。

    首先回顾一下JavaScript中var声明变量的基础知识: • 在使用var关键词声明变量时,变量在函数外则是全局变量,有全局作用域,全局变量在页面关闭后销毁:变量在函数内则是局部变量,作用局部作用 ...

最新文章

  1. springboot源码 红色J_通达信副图指标源码之,出手就赢
  2. infer的用法_typescript高级用法之infer的理解与使用
  3. [翻译-ASP.NET MVC]Contact Manager开发之旅迭代3 - 验证表单
  4. Spring MVC拦截器+注解方式实现防止表单重复提交
  5. 用电脑发短信_丢掉你的手机数据线吧!用这个软件轻松在任何设备互传文件
  6. 杭州计算机学校哪家好,杭州2021年哪所计算机学校比较好
  7. pwm控制的基本原理_单片机PWM控制基本原理详解~
  8. dj鲜生-15-用户的激活-默认激活置为0-点击链接状态置为1
  9. 第三章计算机网络,第三章-计算机网络及应用.ppt
  10. 唤起那些年你对IDL的记忆(二)
  11. 安卓中的布局属性详解
  12. 调用存储过程时报错:Illegal mix of collations
  13. Centos7——NFS(Network File System)服务
  14. (转)文通慧视的用法
  15. springcloud @ComponentScan 多模块 扫描其他模块
  16. 华为 21 级程序员月薪曝光:270k 封神!众网友直呼长见识
  17. 身份验证中的allow users=\?\ /中的?和*各是什么意思?
  18. linux类似的vlookup函数,VLOOKUP函数的使用方法介绍 VLOOKUP函数的操作实例
  19. mysql多表联合查询 去重_mysql中的多表联合并且去重排序
  20. 芯片加速器 Accelerator

热门文章

  1. 机器学习D12——决策树
  2. IoT物联网——各大厂质量保障实践分享汇总(智能语音视频篇)
  3. 【外链建设方法】SEO外链推广方法
  4. 《对不队》团队项目软件系统设计改进
  5. 爱康科技收购北京碳诺科技 加速公司碳排放战略布局
  6. STM32的DS18B20驱动
  7. 高速光耦(PS8101,TLP112A,TLP109)基本工作原理应用实例
  8. java 延时的几种方法方法
  9. c语言char a 4,char a:4;是什么意思C++
  10. 用户注册邮箱通知和短信通知详解(php)