在for循环中 var 和 let的区别

<script>
//var方式的循环
for (var i=0; i<3; i++){
   //要循环执行的代码
}
console.log(i);  //输出3


//let方式的循环
for (let ii=0; ii<3; ii++){
   //要循环执行的代码
}
console.log(ii); //报错  ii is not defined
</script>

为什么会出现上述情况呢?

拆解来看其内部的执行过程

以下是代码var方式的for循环执行过程

var i=0
{i=0 /*执行循环内部代码*/}
{i=1 /*执行循环内部代码*/}
{i=2 /*执行循环内部代码*/}
{i=3 /*结束循环 不执行循环内代码*/}
console.log(3)

以下是代码let方式的for循环执行过程

{let ii=0 /*执行循环内部代码*/}
{let ii=1 /*执行循环内部代码*/}
{let ii=2 /*执行循环内部代码*/}
{let ii=3 /*结束循环 不执行循环内代码*/}
console.log(ii)   //此时ii会报错未定义

作用

使用let可以解决一些特殊的问题

比如经常用在事件绑定中   

使用var的循环绑定事件,等循环完 i的值等于最后的那次循环,所以只能在中间把i的值寄放在元素的属性里或者数组里

而使用let 则不用 因为let相当于在每个循环的块中 都声明了一个变量  都是独立的



相关推荐

javascript原生js实现html中checkbox复选框按shift多选/全选/反选 取被勾选的id

纯原生JavaScript代码 无需任何库整理后 可以直接拿来用的代码<input type='checkbox' name='cateid[]'> <

array.pop()和 array.shift() javascript 数组删除成员

方法:Array.pop() //移除数组中的最后一个元素并返回该元素。如果数组为空 则返回undefined Array.shift() //移除数组中的第一个元素并返回该元素例子:<scri

javascript设置网页 cookiescookies

//取cookies function getCookieByName(name){ for(item of document.cookie.split(';')){ if(it

html左右布局 原生javascript实现分割条 可拖动分隔条

利用浮动+margin实现 左右布局 并用js实现可拖动分隔条 并用cookies记住宽度代码:<style> body{margin:0px;padding:0px;} .body{he

javascript取元素高度 宽度 水平位置 垂直位置

包括边框element.offsetHeight 返回元素的高度。 (包括边框)element.offsetWidth 返回元素的宽度。 element.offsetLeft 返回元素的水平

javascript parseint()函数 - 字符串到整数

定义和用法parseInt() 函数可解析一个字符串,并返回一个整数。当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。当忽略参数 ra

javascript 解析json解析 遍历

代码:obj=JSON.parse('{"id":"8","home":"beijing","uid&

javascript array.slice() 方法

slice 方法 (Array)返回一个数组的一段。arrayObj.slice(start, [end])参数arrayObj必选项。一个 Array 对象。start必选项。arrayObj 中所

javascript合并数组 :concat方法

例子:<script> a = new Array(1,2,3); b = "JScript"; c = new Array(42, "VBScript&q

javascript constructor 属性

constructor 属性表示创建对象的函数。object.constructor必需的 object是对象或函数的名称。说明constructor 属性是所有具有 prototype 的对象的成员