含义
作用域(scope) 是指变量的可访问性
作用域的种类
分为静态作用域(词法作用域)和动态作用域
静态作用域(词法作用域)
是指在词法分析阶段就确定了,不会改变。变量的作用域是在定义时决定而不是执行时决定,也就是说词法作用域取决于源码,通过静态分析就能确定,因此词法作用域也叫做静态作用域。
动态作用域
是在运行时根据程序的流程信息来动态确定的,而不是在写代码时进行静态确定的。 动态作用域并不关心函数和作用域是如何声明以及在何处声明的,只关心它们在何处调用。
执行顺序
如果一个文档流中包含多个script代码段(用script标签分隔的js代码或引入的js文件),它们的运行顺序是:
- 读入第一个代码段(js执行引擎并非一行一行地分析程序,而是一段一段地分析执行的)
- 做词法分析,有错则报语法错误(比如括号不匹配等),并跳转到步骤5
- 对var变量和function定义做“预解析“(永远不会报错的,因为只解析正确的声明)
- 执行代码段,有错则报错(比如变量未定义)
- 如果还有下一个代码段,则读入下一个代码段,重复步骤2
- 完成
es next 新增的变量声明
let命令,const命令,class命令声明的全局变量,不属于顶层的属性。
全局作用域中,用let和const声明的全局变量并没有在全局对象中,只是在一个块级作用域(Script)中
this关键字
this
的值在函数被调用的时候确定,而不是在定义函数的时候。
this
关键字的指向取决于函数调用的位置和方式。
- 全局作用域或函数外部:
this
指向全局对象(在浏览器环境中是window
对象) - 函数内部:取决于函数调用的方式
- 作为普通函数调用:
this
指向全局对象。(默认绑定) - 作为对象的方法调用:
this
指向该对象。(隐式绑定) - 作为构造函数调用:
this
指向新创建的对象实例。(作为构造函数调用) - 使用
call()
、apply()
或bind()
方法调用:this
被显式地设置为这些方法的第一个参数。(显式绑定)
- 作为普通函数调用:
作用域和this的关系
作用域和this的关系,又可以说是作用域(scope)和上下文(context)
作用域(scope) 是指变量的可访问性
上下文(context)是指this在同一作用域内的值,this 永远指向最后调用它的那个对象