作用域

作用域

  • 一块地盘--一个代码所在的区域
  • 是静态的(相对于上下文对象)--在编写代码时就确定了

分类

  • 全局作用域
  • 函数作用域
  • 没有块作用域--ES6有

作用

  • 隔离变量--不同作用域下同名变量不会有冲突

作用域与执行上下文

区别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);
posted @ 2023-04-20 18:30  Liu-h  阅读(17)  评论(0编辑  收藏  举报