什么是作用域

233 阅读2分钟

什么是作用域 作用域即作用范围,在js中采用的是词法作用域,所谓的词法作用域之的是在代码编写的过程中体现出来的作用范围,代码一旦写好,不用执行作用范围就已经决定了,这个就是词法作用域 在js中作用域的规则,

  • 函数运行访问函数外的数据
  • 在整个代码中只有函数可以限定作用域
  • 首先需要考虑提升规则
  • 如果当前作用域中已经有名字,就不再考虑函数外的名字(就近原则)

作用域链

1. 在js中只有函数可以制造作用域,只要有代码就会有一个作用域即全局作用域,凡是代码中有函数那么这个函数就构成了一个新的作用域,如何函数中还有函数,那么在这个作用域中就会再有一个新的作用域诞生,这样将所有的作用域列出来就构成了作用域链

变量的访问

  • 首先看变量在第几条链上(即哪个作用域),在该链上看是否存在变量的定义与赋值,如果有直接拿来使用,
  • 如果没有去上一层链去查找,如果有直接使用,停止继续查找
  • 如果还没有就继续查找.直到找到全局作用域,如果全局作用有中没有,就是is not defined
  • 同级链是不可以混合查找的 #代码预解析(变量提升)

在程序执行的过程中,会先将代码读取内存中,会将所有的声明在此时进行标记,所谓的标记就是告诉解释器知道有这个名字,后面再使用名字的时候,不会出现未定义的错误,这个标记过程就是变量名提升

名字声明:

即变量名提升 :告诉解释器知道已 经有这个名字了。且只提升变量名(没有任何数据与其对应)

函数声明:函数声明包括两个部分:

1. 首先函数声明告诉解释器,这个名字已经存在,还阶段与变量名提升一样 2. 告诉解释器,这个名字对应的函数体是什么

  • . 函数声明与函数表达有区别,函数声明单独写在一个结构中,不存在任何语句。逻辑判断等结构中
  • . 函数后面不加括号

作者:lison 链接:juejin.cn/post/686992… 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。