执行环境、做用域、做用域链、调用对象、闭包

 

 

执行环境 :  每调用一个函数时(执行函数时),系统会为该函数建立一个封闭的局部的运行环境,即该函数的执行环境。函数老是在本身的执行环境中执行,如读写局部变量、函数参数、运行内部逻辑。建立执行环境的过程包含了建立函数的做用域,函数也是在本身的做用域下执行的。从另外一个角度说,每一个函数执行环境都有一个做用域链,子函数的做用域链包括它的父函数的做用域链。关于做用域、做用域链请看下面。闭包

  做用域、做用域链、调用对象:   函数做用域分为词法做用域和动态做用域。   词法做用域是函数定义时的做用域,即静态做用域。当一个函数定义时,他的词法做用域就肯定了,词法做用域说明的是在函数结构的嵌套关系下,函数做用的范围。这个时候也就造成了该函数的做用域链。做用域链就是把这些具备嵌套层级关系的做用域串联起来。函数的内部[[scope]]属性指向了该做用域链。   动态做用域是函数调用执行时的做用域。当一个函数被调用时,首先将函数内部[[scope]]属性指向了函数的做用域链,而后会建立一个调用对象,并用该调用对象记录函数参数和函数的局部变量,将其置于做用域链顶部。动态做用域就是经过把该调用对象加到做用域链的顶部来建立的,此时的[[scope]]除了具备定义时的做用域链,还具备了调用时建立的调用对象。换句话说,执行环境下的做用域等于该函数定义时就肯定的做用域链加上该函数刚刚建立的调用对象,从而也造成了新的做用域链。因此说是动态的做用域,而且做用域链也随之发生了变化。再看这里的做用域,实际上是一个对象链,这些对象就是函数调用时建立的调用对象,以及他上面一层层的调用对象直到最上层的全局对象。    譬如全局环境下的函数A内嵌套了一个函数B,则该函数B的做用域链就是:函数B的做用域—>函数A的做用域—>全局window的做用域。当函数B调用时,寻找某标识符,会按函数B的做用域—>函数A的做用域—>全局window的做用域去寻找,其实是按函数B的调用对象—>函数A的调用对象—>全局对象这个顺序去寻找的。也就是说当函数调用时,函数的做用域链其实是调用对象链。函数

  闭包 :  在动态执行环境中,数据实时地发生变化,为了保持这些非持久型变量的值,咱们用闭包这种载体来存储这些动态数据(看完下面的应用就会很好的体会这句话)。闭包的定义:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(一般是一个函数),于是这些变量也是该表达式的一部分。   闭包就是嵌套在函数里面的内部函数,而且该内部函数能够访问外部函数中声明的全部局部变量、参数和其余内部函数。当该内部函数在外部函数外被调用,就生成了闭包。(实际上任何函数都是全局做用域的内部函数,都能访问全局变量,因此都是window的闭包) 对象

相关文章
相关标签/搜索