做用域是指一段代码的有效范围,在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()是能够执行,说明函数的建立在建立这些属性以前。执行阶段,每次赋值就会覆盖掉这些属性。