博主:DongJiang
码龄:7年
等级:LV.22级
内容:316
今日访问:2312
访问总量:5936
博客简介:学习与分享
博客创建时间:2018-04-12
博客主页 立即前往
赞助位
成为赞助商

什么是作用域和作用域链?

来源: 2024-05-19 17:45:12 播报

作用域是指变量和函数在代码中的可访问范围

作用域链是指在代码中查找变量和函数的过程,当一个变量或函数在当前作用域中找不到时,它会向上层作用域继续查找,直到找到为止,这种层层嵌套的查找关系形成了作用域链。

一、作用域分有全局作用域局部作用域块级作用域

全局作用域

作用于当前所有代码执行的环境(script标签内部)或者一个独立的js文件。

在全局作用域下声明的变量叫做全局变量(在函数外部定义的变量)。任何不在函数中或是大括号中声明的变量,都是在全局作用域下,全局作用域下声明的变量可以在程序的任意位置访问

1、全局变量在代码的任何位置都可以使用。

2、在全局作用域下var声明的变量是全局变量。

3、特殊情况下,在函数内不使用var声明的变量也是全局变量(不建议使用)。

局部作用域

作用于函数内的代码环境,就是局部作用域。因为跟函数有关系,所以也称为函数作用域。

在局部作用域下声明的变量叫做局部变量(在函数内部定义的变量),在局部作用域下声明的函数叫局部函数。

1、局部变量只能在该函数内部使用。

2、在函数内部 var 声明的变量是局部变量。

3、函数的形参实际上就是局部变量。

块级作用域

1、在ES6中新增了块级作用域的概念,使用{}扩起来的区域叫做块级作用域

2、所有用let和const声明的变量符合块作用域。

3、块作用域指非函数的{},if语句和for语句里面的{}也属于块作用域。

4、在块内使用let声明的变量,只会在当前的块内有效。

二、作用域链

1、作用域链:保证对执行环境有权访问的所有变量和函数的有序访问。

2、作用域链是在函数定义的时候就已经产生了,但是并不完整,因为当前函数没有调用,所以当前函数的变量对象还没有产生。

3、当函数调用的时候,会创建当前上下文的变量对象,然后添加在已经生成的作用域链的开始位置,构成完整的作用域链。

4、作用域链的开始位置一定是当前的执行环境的变量对象,结束位置一定是window。

5、变量的解析是沿着作用域链搜索的过程,直到寻找到位置,如果一直找不到,则报错。

原文出处:
版权声明:本文来源地址若非本站均为转载,若侵害到您的权利,请及时联系我们,我们会在第一时间进行处理。