带你深入理解作用域和作用域链

128 阅读2分钟

一.作用域和作用域链的基本概念(ES5)

作用域scope:一个变量的可用范围
作用域链scope chain:
    以当前作用域的scope属性为起点依次引用每个AO(action object),
    直到window结束,形成多级引用关系

二.全局作用域和函数作用域

全局作用域 :window
函数作用域 :function(){} 
在执行过程中,javaScript引擎是严格按照作用域机制来执行的
javaScript的变量和作用域是在定义时决定的,而不是在执行时决定的

三.作用域和作用域链的理解

作用域:
    function a(){
        function b(){
            var bb = 234;
        }
        var aa = 123;
        b();
    }
    var glob = 100;
    a();
    console.log(b) //报错
    console.log(bb) //报错,虽然会做变量提升,但只在当前作用域
创建作用域的流程:
    func创建时生成作用域: [[scope]] 指向 [[scope chain]]
    作用域链相当于一个数组[]
    执行时:
    [0]->指向当前作用域 this argument num...
    [1]->指向全局作用域(global object) this window document func
    比如在作用域里找a,会现在当前作用域去找,如果没有
    再去全局作用域找
    没找到,就报错

四.测试题

var buttons = [{name:'b1'},{name:'b2'},{name:'b3'}];
function bind(){
    for(var i = 0;i<buttons.length;i++){
        buttons[i].fun = function(){
            alert(i);
        }
    }
}
bind();
buttons[0].fun();  //3
buttons[1].fun();  //3
buttons[2].fun();  //3

五.执行环境的流程

浏览器环境栈:js是一个单线程
执行环境:全局执行环境和局部执行环境
变量对象:全局环境下保存的变量对象
活动对象:函数执行环境调用时创建的
当页面加载时,会创建一个浏览器环境栈,这就是全局执行环境。里面有变量对象
当遇到函数时,会创建一个局部执行环境,里面有活动对象 
函数执行完后会被浏览器回收,执行下一个函数