前端深度思考(三)—— 作用域

168 阅读3分钟

作用域

什么是作用域?

作用域为可访问变量,对象,函数的集合。

作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。

在js中,变量的作用域分为全局作用域和局部作用域两种。 一个变量是全局作用域还是局部作用域,主要看变量声明的位置。

全局作用域:

  1. 最外层函数和在最外层函数外面定义的变量
  2. 没有通过关键字"var"声明的变量
  3. 浏览器中,window对象的属性

局部作用域

  1. 在函数内部就是局部作用域,这个代码的名字只在函数的内部起作用
  2. 调用函数时创建函数作用域,函数执行完毕之后,函数作用域销毁;
  3. 每调用一次函数就会创建一个新的函数作用域,它们之间是相互独立的。

块级作用域

在ES6中新增加了一个作用域就是会计作用域,通过let和const声明。那块级作用域什么情况下被创建内?答案如下

在一个函数内部

在一个代码块内部({}包裹的代码块)

let声明的愈发与var的语法一致,基本上可以用let代替var,但会讲变量的作用域限制在当前代码块中。

块级作用域的特点:

声明变量不会提升到代码块顶部

function Scope(){
console.log(scope) // Uncaught ReferenceError: value is not defined
let scope = "块级"
console.log(scope) // 块级
}
Scope()

禁止重复声明

function Scope(){
let scope = 'a'
 //let scope = 'b' // Uncaught SyntaxError: Identifier 'scope' has already been declared
}

小技巧:在循环中可以用let const声明变量

for(let i = 0; i< 100; i++){}
console.log(i) // Uncaught ReferenceError: i is not defined

for(var i = 0; i< 100; i++){}
console.log(i) // 100

作用域的目的

是为了提高程序的可靠性,更重要的是减少命名冲突

变量的作用域

在js中,根据作用域的不同,变量可以分为两种:全局变量局部变量

全局变量

  • 在全局作用域下声明的变量叫做全局变量
  • 全局变量在全局任何位置都可以使用,全局作用域中无法访问到局部作用域中的变量

局部变量

  • 在局部作用域下声明的变量叫做局部变量
  • 局部变量只能在函数内部使用,在局部作用域中可以访问到全局变量

作用域链

在js代码运行中,所有用到的变量都需要去当前上下文环境中查找,当找不到的时候,就会继续查找上层的环境变量。 这样一级一级向上查找的过程,就组合成了一个作用域链。

所以说,作用域链与一个执行上下文相关,是内部上下文所有变量对象(包含父变量对象)的列表,用于变量查询。