概念:它是指对某一变量和方法具有访问权限的代码空间, 在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