做用域与上下文

  做用域是指一段代码的有效范围,在JavaScript中分为全局做用域和局部做用域。全局做用域值得是global对象(window对象),局部做用域则是在全局下的函数或对象的做用域。局部做用域能够访问全局做用域,而全局做用域不能够访问局部做用域。数组

  上下文,JavaScript使用了上下文的概念对应着做用域。函数

  执行上下文: 全局上下文、 局部上下文this

  建立一个上下文:spa

  1. 准备code

    建立新的做用域对象

    建立变量、函数和参数blog

    肯定this关键字的值ip

  2. 执行作用域

    如今能够给变量赋值io

    引用函数来执行其代码

    执行语句

  在准备阶段先建立一个variables对象,保存了上下文中的变量、函数和参数,在variables对象先建立一个arguments数组存放传过来的参数,而后在建立上下文中函数属性(将上下文中函数做为variables对象的属性),最后存放变量属性。执行阶段,执行函数体中的代码,一行一行地运行代码,给variables对象中的变量属性赋值。

  第一个建立全局上下文,将全局上下文放在栈顶部,优先执行。当执行上下文时,最早执行函数,这时会建立函数的上下文,并将其顶到栈顶,由于在栈顶优先处理的元素,因此同名变量中局部做用域比全局做用域优先级要高。

(function(){
    console.log(typeof foo);    //function
    console.log(typeof bar);    //undefind
    
    var foo = 'hello';
    var bar = function(){
        return 'world';
    }
    function foo(){
        return 'hello';
    }
})()

 由于准备阶段查询上下文并建立variables对象的属性,因此只是建立了这些变量并无赋值。可是函数foo()是能够执行,说明函数的建立在建立这些属性以前。执行阶段,每次赋值就会覆盖掉这些属性。

相关文章
相关标签/搜索