作用域
- 一块地盘--一个代码所在的区域
- 是静态的(相对于上下文对象)--在编写代码时就确定了
分类
作用
作用域与执行上下文
区别1
- 全局作用域外--每个函数都会创建自己的作用域--作用域在函数定义时就已经确定了--而不是在函数调用时
- 全局执行上下文环境是在全局作用域确定之后--JS代码马上执行之前创建
- 函数执行上下文环境是在调用函数时--函数体代码执行之前创建
区别2
- 作用域是静态的--只要函数定义好了会一直存在--不会再变化
- 执行上下文是动态的--调用函数时创建--函数调用结束时上下文环境会被释放
联系
- 上下文环境(对象)是从属于所在的作用域
- 全局上下文环境-->全局作用域
- 函数上下文环境-->对应的函数作用域
var a = 10, b = 20;
function fn(x) {
var a = 100, c = 300;
function bar(x) {
var a = 1000, d = 4000;
}
bar(100);
bar(200);
}
fn(10);
作用域链
- 多个上下级关系的作用域形成的链--方向是从下向上的(从内到外)
- 查找变量时沿着作用域链来查找的
查找一个变量的查找规则
- 在当前作用域下的执行上下文中查找对应的属性--若有直接返回--否则进入2
- 在上一级作用域的执行上下文中查找对应的属性--若有直接返回--否则进入3
- 再次执行2的相同操作--直到全局作用域--若还找不到就抛出找不到的异常
var a = 1;
function fn1() {
var b = 3;
function fn2() {
var c = 3;
console.log(c); //3
console.log(b); //3
console.log(a); //1
console.log(d); //报错
}
fn2();
}
fn1();
面试题
var x = 10;
function fn() {
console.log(x); //10
}
function show(f) {
var x = 20;
f();
}
show(fn);