简介:作用域为可访问变量,对象,函数的集合,限定其可用性的范围即作用域,作用域的使用提高了程序逻辑的局部性,增强程序的可靠性
文章均为个人原创, 搬运请附上原文地址感谢, 原文来自MasterYi博客
function test(){
var a = 1;
}
test(); // 执行结束后, 局部变量会自动销毁
console.log(a); // 无法访问局部的变量
for(var a = 1; a < 10 ; a++){
}
console.log(a); // 打印10 因为原有的var无块级作用域会泄漏为全局变量, 改为let即可
if(true){
var b = 1;
}
console.log(b); // 打印1 var无块级作用域会泄漏为全局变量
var arr = [1, 2, 3]
while (arr.length){
var c = arr.pop();
}
console.log(c); // 打印 1 var无块级作用域会泄漏为全局变量
switch (1){
case 1:
var d = 1;
}
console.log(d); // 打印 1 var无块级作用域会泄漏为全局变量
var a = 1;
var b = 2;
function foo1(){
console.log(a); // 打印 undefined, 读取顺序: foo1(读到a, 此处的a之所以为undefined,是因为函数激活时创建了AO(执行上下文), var声明的变量进行了提升 名字为属性值,值默认为undefined )
var a = 2;
console.log(a); // 打印 2, 读取顺序: foo1(读到a )
function foo2(){
console.log(a); // 打印 undefined , 读取顺序: foo2(读到a)
var a = 3;
function foo3(){
console.log(a); // 打印 3, 读取顺序: foo3 -> foo2(读到a)
var c = 4;
}
foo3();
console.log(b); // 打印2, 读取顺序: foo2 -> foo1 -> 全局 (读到b)
console.log(c); // 异常, 并不会读取foo3中的 c, 子集可以访问父集,父集不能访问子集 , 读取顺序: foo2 -> foo1 -> 全局(全局无抛异常)
}
foo2()
}
foo1();