作用域
什么是作用域?
作用域为可访问变量,对象,函数的集合。
作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。
在js中,变量的作用域分为全局作用域和局部作用域两种。 一个变量是全局作用域还是局部作用域,主要看变量声明的位置。
全局作用域:
- 最外层函数和在最外层函数外面定义的变量
- 没有通过关键字"var"声明的变量
- 浏览器中,window对象的属性
局部作用域
- 在函数内部就是局部作用域,这个代码的名字只在函数的内部起作用
- 调用函数时创建函数作用域,函数执行完毕之后,函数作用域销毁;
- 每调用一次函数就会创建一个新的函数作用域,它们之间是相互独立的。
块级作用域
在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代码运行中,所有用到的变量都需要去当前上下文环境中查找,当找不到的时候,就会继续查找上层的环境变量。 这样一级一级向上查找的过程,就组合成了一个作用域链。
所以说,作用域链与一个执行上下文相关,是内部上下文所有变量对象(包含父变量对象)的列表,用于变量查询。