实行环境
实行环境中定义了变量和函数有权接见的其他数据,决议了他们各自的行动。
当JavaScript诠释器初始化实行代码时,它起首默许进入全局实行环境,从现在最先,函数的每次挪用都邑建立一个新的实行环境。
每一个函数都有本身的实行环境。当实行流进入一个函数时,函数的环境就会被推入一个环境栈中(execution stack)。在函数实行完后,栈将其环境弹出,把掌握权返回给之前的实行环境。ECMAScript顺序中的实行流恰是由这个方便的机制掌握着。
实行环境能够分为建立、实行、烧毁三个阶段。在建立阶段,剖析器起首会建立一个变量对象(variable object),它由定义在实行环境中的变量、函数声明、和参数构成。在这个阶段,作用域链会被初始化,this的值也会被终究肯定。在实行阶段,代码被诠释实行。 某个实行环境中的一切代码实行终了后,该环境被烧毁,保留在个中的一切变量和函数定义也随之烧毁
作用域链
当代码在一个实行环境中实行时,会建立变量对象的一个作用域链
作用域链的作用是:保证对 当前实行环境权接见的一切变量和函数的有序接见
作用域的前端一直是当前实行的代码地点环境的变量对象
作用域链的末了一直是全局实行环境的变量对象
作用域链里只包含上一级的变量对象,但并不包含下一级的变量对象
标识符剖析的是沿着作用域链一级一级地搜刮标识符的历程,搜刮一直从作用域链的前端最先(当前环境的变量对象),逐级向后查找(上级环境的变量对象),直至找到标识符为止
内部环境能够经由过程作用域链接见一切外部环境,然则外部环境无法接见内部环境中的任何变量和函数
延伸作用域链:
在作用域链的前端(本身的变量对象之前)暂时增添一个变量对象,该变量对象会在(这段)代码实行后被移除
try-catch语句中的catch块
with语句:
function builder(){
var str = "advd"
// 在作用域链的前端暂时增添了一个变量对象,如许在当前实行环境中就能够接见loaction的属性和要领了
with(location){
var url = href + str
}
// 当with代码实行后,作用域链中的暂时变量对象被移除,此时无法接见href
console.log(href) // Uncaught ReferenceError: href is not defined
return url
}
作用域
我以为作用域链是对变量对象/实行环境而言的,当实行环境中涌现一个变量时,应当根据如何的搜刮体式格局(沿着作用域链)去找到这个变量
作用域是关于变量而言的,指清楚明了这个变量在哪些地方能够被接见到,比方某一变量处于全局作用域中,则该变量能够在代码的任何地方被接见到
全局作用域:
最外层函数和最外层函数表面定义的变量具有全局作用域
一切 未定义 (要明白这个未定义的寄义) 直接赋值的变量自动声明为具有全局作用域
window对象的属性具有全局作用域
函数作用域:
在函数中定义的变量
给函数通报的参数