JS百题斩~秒懂数据的作用域(超详细)

2024-06-04 20:04

本文主要是介绍JS百题斩~秒懂数据的作用域(超详细),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据的作用域

定义:作用域是运行时代码中的变量,函数和对象的可访问性。通俗的意思就是数据在哪个范围是有效可用的,出了这个范围就不能用了。
作用域在哪,关键看在哪里定义的。
ES6之前没有块级作用域。

1.JS有两种作用域:全局作用域和函数作用域

全局作用域:在代码中任何地方都能访问到的对象拥有全局作用域。(所有未定义直接赋值的变量,自动声明为全局作用域)
函数作用域:函数作用域也叫局部作用域,指声明在函数内部的变量,函数的作用域一般只在固定代码片段中可访问到,例如函数内部。

全局作用域有弊端:如果我们写了很多行JS代码,变量定义都没有用函数包裹,那么他们就全部都在全局作用域中,这样就会污染全局命名空间,容易引起命名冲突。所以,很多第三方库的源码,所有的代码都在(function (){…})()立即执行函数中,这样保证里面的变量不会暴漏和外泄,污染全局变量,这就是函数作用域的作用。

  • 作用域是分层,里面的作用域能访问外面的,反之不行,访问的时候从内向外依次查找。
  • 如果在内部的作用域中访问了外部,则会形成闭包。
  • 内部作用域能访问的外部,取决于函数定义的位置,和调用无关,这就是所谓的静态作用域(作用域不等于执行上下文)。

2.变量提升

作用域里面定义的变量、函数声明会提升到作用域顶部。

3.块级作用域

ES5只有全局作用域和函数作用域,没有块级作用域,会带来以下问题:
1.变量提升导致内层变量可能会覆盖外层变量;

var  a = 5;
function f(){console.log(a);if(true){var a = 6;       }
}
f();
// undefined

2.for循环里面用来计数的变量泄露为全局变量;

// 需求:五个按钮,点击某个按钮, 提示'第 n 个'
for (let i = 0; i < btns.length; i++) {btns[i].onclick = function () {console.log('第' + (i + 1) + '个')}
}
// 结果:点击任何一个按钮,都是弹出'第 6 个'
// 这是因为 i 泄露为全局变量,执行到点击事件时,此时 i 的值为 5

所以ES6新增了块级作用域。
块级作用域可通过 let 和 const 声明,声明的变量在指定代码块的作用域外无法被访问。块级作用域在下面的情况下被创建:
1.函数内部;
2.代码块内部,用一对花括号包裹;

4.作用域链

当js中使用一个变量的时候,首先会尝试在当前作用域下去寻找该变量,如果没找到,再到它的上一层作用域找,一直找到该变量或者已经到了全局作用域,如果在全局作用域仍然找不到该变量,严格模式下会直接报错。
内部函数访问外部函数的变量,采取的是链式查找的方法来决定取哪个值,这种就称为作用域链。函数内部是根据就近原则来访问变量。

注意,变量的作用域,在创建时就已经确定好了,而非调用阶段确定的,所以某个作用于的上层作用域指的是包裹它的作用域,而非调用。

两个小练习:

// 下面的代码输出什么
var a = 1;
function f1() {a++;
}
function f2() {var a = 3;f1();console.log(a);
}
f2();
console.log(a);
// 3 2
// 内部作用域能访问的外部,取决于函数定义的位置,和调用无关。所以a++后打印的是2
// 下面的代码输出什么
var a = 1,b = 2;
function f() {console.log(a);var a = 2;function f1() {console.log(a, b);}f1();
}
f();
// undefined 3 2
// 作用域里面定义的变量、函数声明会提升到作用域顶部。所以打印第一个a时,变量a被提升到了f函数顶部,输出undefined

下一篇: JS百题斩~ typeof 与 instanceof 区别

这篇关于JS百题斩~秒懂数据的作用域(超详细)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1030980

相关文章

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

Python的pandas库基础知识超详细教程

《Python的pandas库基础知识超详细教程》Pandas是Python数据处理核心库,提供Series和DataFrame结构,支持CSV/Excel/SQL等数据源导入及清洗、合并、统计等功能... 目录一、配置环境二、序列和数据表2.1 初始化2.2  获取数值2.3 获取索引2.4 索引取内容2

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda