- 块级作用域:es6中一对大括号就是一个块级作用域
- 私有作用域:函数执行时形成的作用域,这个作用域中定义的变量外部不能访问,函数执行后就销毁
常见的块级作用域场景
- 对象
- if(){}
- for(){}
块级作用域应注意 不能直接放在行首
{name:'xiaoming',age:10}
如果想表示一个对象 ,直接写,会认为是一个块级作用域。
通过括号包起来,或者通过定义变量的形式避免 { 位于行首即可
if条件判断中包含有定义变量的情况,会根据是否能进入条件来决定变量能否定义声明
if(1){ //可以进入条件判断
var a=1;
function geta(){
}
}
console.log(a) //1
console.log(geta) //geta函数
//不能进入条件判断
//此时函数只会提前声明 不会定义,当条件成立先给函数赋值 代码再执行
if(0){
var a=1;
function geta(){}
}
console.log(a) //undefined
console.log(geta) //undefined
for循环事件绑定,是一个异步操作
通常利用for循环给遍历的元素进行事件绑定,是一个异步操作
当元素执行事件的时候,才会触发绑定的事件,不可能一直挂起等待用户点击后才执行下一步
var doms = document.getElementsByTagName('div')
for(var i-0;i<doms.length;i++){
doms[i].onclick = function(){
alert(i)
}
}
上面代码中i定义的是一个全局变量,外部可访问。最终div绑定的元素全部提示相同,都是doms.length
解决方案
- 使用let定义i,使变量i变成私有的,外部不可访问
- 给元素添加额外的属性
doms[i].index = i
doms[i].onclick = function(){
alert(doms[i].index)
}
- 利用闭包
- setTImeout
网友评论