作用域、作用域链、执行上下文

什么是作用域?

作用域指的是一个变量作用的范围

全局作用域

全局作用域中的变量都是全局变量,在页面的任意地方都可以读取。

所有末定义直接赋值的变量都将被自动添加到全局作用域。

所有window对象的内置属性 ,例如window.name、window.location、window.top等等都是全局变量,并且所有属于全局作用域的变量都是Windows对象的属性。

局部作用域

调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁。

每调用一次函数就会创建一个新的函数作用域,他们之间是互相独立的。

在函数作用域中可以访问到全局作用域的变量,在全局作用域中无法访问到函数作用域的变量。

执行上下文

执行上下文就是当前代码的执行环境。

主要分为三种:

全局环境:JavaScript代码运行起来会首先进入该环境

函数环境:当函数被调用执行时,会进入当前函数中执行代码

eval

代码开始执行时,首先会产生一个全局执行上下文环境,调用函数时,会产生函数执行上下文环境,函数调用完成后,它的执行上下文环境以及其中的数据都会被销毁,重新回到全局执行环境,网页关闭后全局执行环境也会销毁。其实这是一个压栈出栈的过程,全局上下文环境永远在栈底,而当前正在执行的函数上下文在栈顶。

下图代码有4个执行上下文:全局上下文和f1(),f2(),f3()属于自己的执行上下文

作用域、作用域链、执行上下文_第1张图片

作用域链

代码中至少有一个作用域, 即全局作用域。

代码中有函数,那么这个函数就构成另一个作用域。

如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域。

将这样的所有的作用域列出来,可以形成的结构就称之为作用域链。

所以作用域链可以被看作一种有秩序的路径,在变量解析过程中,它的访问规则是就近原则,首先查找当前局部的作用域,然后查找上层作用域,由内到外地查找,直到到找到最近定义的变量。

作用域、作用域链、执行上下文_第2张图片

你可能感兴趣的:(作用域、作用域链、执行上下文)