ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JavaScript作用域

2022-01-21 21:02:55  阅读:114  来源: 互联网

标签:变量 作用域 JavaScript 解析 声明 函数


作用域


一 概念

简单的说 一段程序代码中所用到的名字并不总是有效和可用的 ,而限定这个名字的可用性的代码范围就是这个代码名字的作用域
作用域的使用提高了程序逻辑的局部性 增强了程序的可靠性同时也减少了名字冲突
作用域分为下面两种作用域

全局作用域

全局作用域作用于所有代码运行的环境 (整个script标签内部) 或者一个独立的js文件

局部作用域

局部作用域 也被称之为 函数作用域 指的是作用于函数内的代码环境 就是局部作用域

块级作用域

在ES6之前 JavaScript中没有块级作用域
在ES6之后 块级作用域由{}包括,if语句和for语句里面的{}也属于作用域
但是在现阶段 js是没用块级作用域,在{}中写变量是外面是可以调用的;

二 变量的作用域

在JavaScript中 根据作用域的不同 变量也可以分为以下两种

全局变量

在全局作用域下声明的变量叫做全局变量

全局变量在代码的任何位置都可以使用
在全局作用域下var声明的变量 是去哪句变量
在特殊情况下 在函数内不使用var声明的变量也是全局变量 但是我们不建议使用
如下所示 就是一个作用于全局的变量
在这里插入图片描述

局部变量

在局部作用域下声明的变量叫做局部变量(在函数内部定义的变量)
局部变量只能在该函数内部使用
在函数内部用var声明的变量就是局部变量
函数的形参实际上就是局部变量
如下图所示就是一个局部变量
在这里插入图片描述

三 作用域链

内部函数访问外部函数的变量 采取的是链式查找的方式来决定哪个值;
访问变量的是很好,某个作用域中没有变量 ,就会依次向上访问上层作用域中的变量 也就是就近原则;

四 预解析

由于JavaScript代码是由浏览器中的JavaScript解析器来执行的。 JavaScript解析器在运行JavaScript代码的时候分为两步
预解析和代码执行(从上往下执行代码);
预解析是值在当前作用域下 , 在js代码执行之前 ,浏览器会默认把带有var(变量)和 function(函数)声明的变量在内存中进行提前的声明或是定义
预解析会把变量和函数的声明在代码执行之前执行完成。

变量预解析

预解析也叫做变量,函数提升
变量提升(变量预解析):变量的声明会被提升到当前作用域的最上面,变量的赋值不会提升
我们来做个案例方便大家理解
在这里插入图片描述
因为变量预解析只会提升变量 不会提升赋值
所以相当于

var num;
console.log(num);
var num =100;

又因为我们的代码执行是从上往下 所以是underfined

函数预解析

函数提升:函数的声明会被提升到当前作用域的最上面
但是不会调用函数
在这里插入图片描述
函数声明代表函数整体,所以函数提升后,函数名代表整个函数,但是函数并没有被调用!
这里我们需要注意的是
如果我们使用匿名函数 会执行变量提升 无法正确的调用函数

案例如下
在这里插入图片描述

解释:该段代码执行之前,会做变量声明提升,fn在提升之后的值是undefined;而fn调用是在fn被赋值为函数体之前,此时fn的值是undefined,所以无法正确调用

标签:变量,作用域,JavaScript,解析,声明,函数
来源: https://blog.csdn.net/xihuanLilia/article/details/122628226

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有