JS中的作用域分为两种:
函数都有自己的作用域,
全局作用域和局部作用域(局部变量)还有es6中的块级作用域。
函数作用域中定义的变量,只能在函数中调用,外界无法访问。
没有块级作用域导致了if或for这样的逻辑语句中定义的变量可以被外界访问,
因此ES6中新增了let和const命令来进行块级作用域的声明。
块级作用域:
内层变量可能会覆盖外层变量。
//循环绑定的问题
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1);
}
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1);
}
作用域链 变量的查找机制
作用域链
当前作用域没有定义的变量,这成为 自由变量 。自由变量的值如何得到 —— 向父级作用域寻找。一层一层向上寻找,直到找到全局作用域还是没找到,就宣布放弃。这种层层的寻找关系,就是作用域链 。
上级作用域 函数在哪里定义的,那么该函数执行形成的作用的上级作用域就是谁
了解了上级作用域, 就比较容易查找变量对应的值