概念:它是指对某一变量和方法具有访问权限的代码空间, 在JS中, 作用域是在函数中维护的。表示变量 或函数起作用的区域,指代了它们在什么样的上下文中执行,亦即上下文执行环境。
ES5的作用域只有两种:全局作用域和局部作用域
全局作用域
- var a=1; //全局作用域
- function fn1(){
- console.log(a)
- };
- fn1()
局部作用域
- function fn1(){
- var a=1; //局部作用域
- };
- fn1();
- console.log(a);
全局变量和局部变量同名的坑
(1)在全局变量和局部变量不同名时,其作用域是整个程序。
(2)在全局变量和局部变量同名时,全局变量的作用域不包含同名局部变量的作用域。
- var c =10
-
- function fn () {
-
- var c
-
- console.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 相当于拿到的全局变量 指向的是window
-
- 100 // 前面赋值 a = 100