概念:它是指对某一变量和方法具有访问权限的代码空间, 在JS中, 作用域是在函数中维护的。表示变量 或函数起作用的区域,指代了它们在什么样的上下文中执行,亦即上下文执行环境。
ES5的作用域只有两种:全局作用域和局部作用域
全局作用域
var a=1; //全局作用域
function fn1(){console.log(a)
};
fn1()
局部作用域
function fn1(){var a=1; //局部作用域
};
fn1();
console.log(a);
全局变量和局部变量同名的坑
(1)在全局变量和局部变量不同名时,其作用域是整个程序。
(2)在全局变量和局部变量同名时,全局变量的作用域不包含同名局部变量的作用域。
var c =10function fn () {var cconsole.log(c) // undefined} fn()解释:其实就是当全局变量和局部变量同名的时候,局面是拿不到全局的变量
var a=1;
function fn1(){console.log(a)var a = 2;
};
fn1();
console.log(a); undefined //var声明会进行预解析 提前
1 //拿到的是全局变量
经典作用域面试题
var a =1
function fn () {console.log(a) // 1 全局变量
a = 2 //修改了全局变量
}fu()console.log(a) // 2
var a = 10;
function f1(){ var b = 2 * a; var a = 20;var c = a+1; console.log(b); console.log(c);
}
f1()NaN // 首先内部a会提前进行预解析 变量提升 是undefined * 2
21 // 此时预解析 a=20 + 1
var a=10;
function test(){console.log(a);a=100;console.log(this.a); var a;console.log(a);
}
test();undefined // 首先test'调用' 会去内部查找变量 var a 会进行预解析 此时只是声明了 但是没赋值10 // this 相当于拿到的全局变量 指向的是window100 // 前面赋值 a = 100