1.执行环境
执行环境中包含了变量和函数有权访问的其他数据。 每一个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在该对象中。 全局执行环境是最外层的一个执行环境。 在web浏览器中全局执行环境为window,在node中是global对象。
2.作用域是什么?
函数执行期间的上下文就是作用域。(其外部环境) 下面我们看一个特殊的例子:
var name = "The Window" ;
var object = {
name : "My Object" ,
getNameFunc : function ( ) {
var that = this ;
return function ( ) {
return that. name;
} ;
}
} ;
alert ( object. getNameFunc ( ) ( ) ) ;
解析(这里分两点来说):
首先,最后执行的那个函数(即:getNameFunc 函数返回的函数)中有个变量that,当该函数执行时,程序要去寻找这个that,根据作用域链的机制,他会找到getNameFunc 函数的that,所以,它会取值这个that,而getNameFunc 的that的值由this赋予的。 这个就涉及到js函数中的this的指向问题了。
对于非箭头函数来说,函数中的this在执行期间确定。指向调用它的对象。显然,这里调用是对象object在调用,所以,指向object。因此,that.name访问的是object中的name属性了。 对于箭头函数来说,函数中的this,由定义它的离它最近的非箭头函数中的this所确定。而不是在执行期间确定。
3.作用域链
当代码在一个环境中执行时,会创建一个变量对象的作用域链。作用域链的用途是,保证对执行环境有权访问的所有变量和函数的有序访问。 作用域链的最前端,始终是当前执行的代码所在环境的变量对象。作用域链的下一个变量对象来自包含环境,而再下一个变量对象,来自下一个包含环境。