作用域与作用域链的联系与应用
作用域
作用域是指变量和函数可以访问的范围
也就是说变量起作用的区域,在这个区域内你可以使用这个变量
全局作用域
允许在任何地方访问一个变量的区域
全局作用域是浏览器运行文件时自动生成的一个作用域,该作用域有一个对象Global Object 在浏览器中叫做window对象。
该对象将在全局作用域中声明的变量和函数作为自己的属性和方法,也就是说在全局作用域中声明的变量可以通过window对象进行访问。
//此时a所在的区域就是全局作用域
var a =10;
console.log(a);
console.log(window.a);
输出结果为
根据输出结果我们可以看出,window的确是将在全局作用域中声明的变量作为自己的属性
我们可以认为window代表的是全局作用域
那么全局作用域是怎么来的呢
在浏览器运行时就会产生一个运行函数的栈,在这个栈中运行函数也就产生了window对象
全局作用域的作用
全局作用域给变量和其他在该作用域中声明的语句提供了生存环境,也就是说允许这些变量和语句在当前这个环境中进行各种操作,能够正常的运行
我们亦可以通过window对象查看对象中已有的属性和方法,在一定程度上避免全局污染
函数作用域
函数作用域是指在函数体内的作用域
当一个函数执行时会创建自己的执行期上下文也就是函数作用域,在函数作用中可以访问函数体内声明的变量和函数也可以访问函数外部声明的变量和函数,但是外部作用域不能访问函数内部的变量。
var a= 10;
function sum(){
var b = 20;
console.log(a+b);
}
输出结果为
根据输出结果可以看出在函数内部是可以访问的外部的变量的,那么为什么在函数内部能访问外部的变量呢。
在函数声明时函数就有一个外部作用域的引用,也就是说当函数声明时,会与外部作用域产生联系当函数需要一个变量时如果在函数作用域中找不到就会通过这个外部作用域的引用找需要的变量。因此,函数能够访问外部作用域的变量
那么如果在函数外部输出变量b又会发生什么呢
var a= 10;
function sum(){
var b = 20;
console.log(a+b);
}
console.log(b);
输出结果为
根据输出结果可以看出外部是不可以访问函数内部的变量的,因此因此函数就有了下面的一些作用。
函数作用域的作用
- 由于外部不能访问函数体内的变量因此可以起到保护变量的作用,如果在编程过程中不想外部访问和修改一个变量可以使用函数的方式保护改变量
- 我们可以利用函数避免全局污染,在编程过程中由于生命的变量过多很容易出现重名的现象,如果不小心覆盖了或修改了一个变量的值会造成一系列的麻烦,因此我们可以利用函数避免全局污染的情况。
作用域链
作用域链是多级作用域相互联系形成的链式结构
那么这个链式结构是怎么形成的呢
在函数执行时会创建自己的作用域,刚才在函数作用域中也说到函数在声明时会与外部作用域产生联系,在函数执行时函数作用域与外部作用域就产生了联系作用域链由此而生。
我们可以根据刚才的代码画出作用域链
根据图片可以看出,有一个main函数(浏览器执行的函数,暂且叫做main)执行创建了window对象也就是全局作用域,在全局作用域中我们声明了一个变量a和sum函数,当sum函数执行时又创建自己的函数作用域,在sum的函数作用域中声明了变量b,sum与外部作用域产生的联系链接了全局作用域,此时函数作用域与全局作用域就形成了一个链式结构,只不过比较短而已。
作用域链的作用
- 前面讲到的函数内部访问外部变量就是通过作用域链访问的
- 实现闭包,闭包就是在函数内部声明的函数通过对外部函数的引用使得外部函数的作用域得以保存即便这个外部函数已经运行完毕,从而在全局作用域、外部函数作用域、自己的函数作用域之间形成闭环而形成闭包。
总结
- 全局作用域是所有变量和函数以及其他语句赖以生存的环境,没有全局作用域也就没有这些变量,就相当于没有地球国家也就无法存在。
- 函数作用域可以用来保护变量从而实现私有变量,也可以避免全局污染。
- 作用域链是函数内部访问外部变量的基础,同时通过作用域链的特性也可以实现闭包。
本文地址:https://blog.csdn.net/qq_40850839/article/details/107875256
下一篇: 张量限幅