一.作用域和作用域链的基本概念(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();
buttons[1].fun();
buttons[2].fun();
五.执行环境的流程
浏览器环境栈:js是一个单线程
执行环境:全局执行环境和局部执行环境
变量对象:全局环境下保存的变量对象
活动对象:函数执行环境调用时创建的
当页面加载时,会创建一个浏览器环境栈,这就是全局执行环境。里面有变量对象
当遇到函数时,会创建一个局部执行环境,里面有活动对象
函数执行完后会被浏览器回收,执行下一个函数