js作用域二:作用域链的简单理解

1,042 阅读1分钟

作用域链的简单理解

什么是作用域链

  • 作用域链:由下往上或由里往外一层一层查找自由变量的关系,就是作用域链
  • 自由变量:当前作用域未定义的变量

全局作用域链、局部作用域链

  1. 全局作用域链:由下往上
  2. 局部作用域链:由里往外

1.全局作用域链:由下往上

<script>
    var name = 'Rica';
</script>

<script>
    console.log('我是上一个<script>标签中的:' + name); // 我是上一个<script>标签中的:Rica
</script>

2. 局部作用域链:由里往外

var a = 1;
function fn1() {
    console.log(a); // undefined
    var a = 2;
}
fn1();
console.log(a);	    // 1
/* --
第一步:预解析,找 var function 参数 放到仓库
a = undefined;
fn1 = function fn1() {
    console.log(a);
    var a = 2;
}

第二步:逐行执行代码
表达式:a = 1;
函数调用:fn1() 执行函数调用的时候又开始了一个函数的作用域
函数里面的第一步预解析 a = undefined;
函数里面的第二步逐行执行代码 console.log(a);
-- */
var a = 1;
function fn1() {
    console.log(a); // 1
    a = 2;
}
fn1();
console.log(a);	    // 2

/* --
第一步:预解析,找var function 参数 放到仓库
a = undefined;
fn1 = function fn1() {
    console.log(a);
    a = 2;
}

第二步:逐行执行代码
表达式:a = 1;
函数调用:fn1();执行函数调用的时候又开始了一个函数的作用域
函数 fn1 里面没有 var function 所以不用预解析
直接开始执行console.log(a);
console.log(a) 的时候在 fn1 预解析的小仓库中找不 a,js解析器会顺着 作用域链 找到上一级的 a = 1
-- */

相关