javascript的一些概念。
执行环境---上下文环境
变量对象
活动对象
变量对象(活动对象)的属性
内部作用域
作用域链
闭包
首先从执行环境说起
javascript首先会有一个执行环境,这个执行环境就是全局环境。
在开始执行代码的时候,就会把全局环境压入到环境栈中,栈的顶部指针指向当前环境。
全局环境内部也有一个作用域,这个作用域此时只有变量对象,就是所谓的window对象。
变量对象上有一些属性,这些属性是扫描javascript代码的时候,会把变量和函数添加到自己的属性上去。此时变量的的值是undefined,函数又有不同。
函数在定义的时候,其内部会有一个内部的作用域,我们在程序中是没有办法访问的,代码执行的后台能对它进行操作。
这个内部的作用域里面有它所处的执行环境的活动对象(对全局环境来说就是变量对象)和它自己的arguments等变量。
在执行环境中还有一个作用域链的概念,这个作用域链在全局执行环境里就包括变量对象。
当代码一步步执行的时候,碰到变量进行定义操作的时候,就会把值附上去。
如果碰到函数调用,就会把函数的作用域添加到环境栈中。此时的作用域链就会把这个函数的内部作用域添加上去,当然这里都是指针。
当代码进行查找变量和函数的时候,就会从作用域链上进行查找,如果在作用域链上没有找到,就会报错。
如果在此函数的执行环境中又调用了新的函数,新的函数就会接管执行环境,给作用域添加新的指针。
当函数里的代码执行完毕的时候,就会在栈中把该函数的执行环境弹出,它所有的变量和内部的作用域都已被消除,同时作用域链也会去掉指向该函数的指针。
重复上面的操作,这就是javascript运行的机制。
闭包之所以能够访问已经被销毁的函数里的变量,就是因为在闭包的作用域还包含着那个被销毁的函数的活动变量。