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 区别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/22313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决linux系统求前N月月份的bug

日常工作中&#xff0c;需要获取某个日期&#xff08;20240531&#xff09;的前N个月&#xff0c;通常会写命令 date -d "20240531 last-month" %Y%m 我期望得到202404 但是很意外&#xff1a; 经过几轮测试&#xff0c;发现只要月内天数超过30天&#xff0c;即所有…

短视频动画脚本:成都鼎茂宏升文化传媒公司

短视频动画脚本&#xff1a;创作与魅力的探索 在数字化时代的浪潮中&#xff0c;短视频动画以其独特的魅力迅速崛起&#xff0c;成为大众娱乐和信息传播的重要载体。成都鼎茂宏升文化传媒公司作为一名原创文章编辑&#xff0c;我深入探索了短视频动画脚本的创作过程&#xff0…

二,几何相交-5,BO算法分析--(1)正确性

也就是说&#xff0c;BO算法有没有可能误报或者漏报&#xff1f; 一&#xff0c;为什么不会误报&#xff1f; 因为两条线段从不相邻到相邻&#xff0c;或者其中一条线段不存在到相邻&#xff0c;都会进行一次相交测试。所以不会误报。 二&#xff0c;为什么不会漏报&#xff1…

学习算法笔记(7.5)-贪心算法(股票售卖问题)

学到这里的大家应该都非常清楚贪心算法到底是怎么一回事了&#xff0c;说白了就是动态规划的一种特例&#xff0c;没有动态规划的使用范围广&#xff0c;但是效率却比动态规划效率高&#xff0c;贪心算法不考虑之前的情况&#xff0c;只考虑当前的最优选择以期达到最优的结果。…

五款效率软件助你事半功倍

1、&#x1f517; 亿可达 作为一款自动化工具&#xff0c;亿可达被誉为国内版的免费Zaiper。它允许用户无需编程知识即可将不同软件连接起来&#xff0c;构建自动化的工作流程。其界面设计清新且直观&#xff0c;描述语言简洁易懂&#xff0c;使得用户可以轻松上手。 2、&…

轻松产出创新点!多元时间序列最新可参考成果,高性能高精度

今天给大家推荐一个好挖创新点的研究方向&#xff1a;多元时间序列。 多元时间序列是我们解决复杂系统分析和预测问题的重要工具。它通过综合分析多个相关时序数据&#xff0c;可以给我们提供更精准的预测结果&#xff0c;非常适合处理涉及多个变量和多个时间点数据的场景&…

基于 GhostNet 不同版本的图像识别

1、介绍 GhostNet 文章地址&#xff1a;[1911.11907] GhostNet: More Features from Cheap Operations (arxiv.org) 主要思想&#xff1a; 特征提取的时候&#xff0c;很多特征图是具有高度相似性的&#xff0c;也就是说存在许多的冗余特征图。 从另一个角度想&#xff0c;…

从零开始实现自己的串口调试助手(5) -实现HEX显示/发送/接收

实现HEX显示: HEX 显示 -- 其实就是 十六进制显示 --> a - 97(10) --> 61(16) 添加槽函数(bool): 实现槽函数: 注意: 注意QString 没有处理HEX显示的相关API 需要使用 toUtf-8 来 转换位QByteArry 类型&#xff0c; 利用其中的API 来处理HEX格式(toHex fromHex) vo…

【做一道算一道】字节实习笔试(A出来的两道)

快乐氛围 题意大概是派对上每个人的氛围值不同&#xff0c;值高的跟值低的打招呼&#xff0c;总氛围会产生变化&#xff0c;值相同的打招呼不产生变化&#xff0c;求整体派对的氛围值。 氛围值变化公式高值-低值 示例 输入&#xff1a; 3 2 4 0 输出&#xff1a; 8 意为&…

Kubernetes外部服务管理Ingress介绍

前言 在 Kubernetes 集群中&#xff0c;管理外部服务的访问和流量路由至关重要。通过使用 Ingress 控制器&#xff0c;我们能够实现对外部服务的有效管理&#xff0c;配置灵活的路由规则&#xff0c;并实现负载均衡和流量控制。 目录 一、Ingress 介绍 1. Ingress 概述 2.…

【求助】ansible synchronize 问题

求助贴&#xff0c;不是解答贴哈 最近把一台服务器从centos7.9升级到alibaba cloud linux3之后&#xff0c;出现了一个ansible的问题。 版本是ansible8.3.0ansible-core-2.15.3&#xff0c;在使用synchronize模块时&#xff0c;我使用了别名&#xff08;比如web1&#xff09;会…

Windows下搭建Cmake编译环境进行C/C++文件的编译

文章目录 1.下载Cmake2.安装MinGW-w643.进行C/C文件的编译 1.下载Cmake 网址&#xff1a;https://cmake.org/download/ 下载完成后安装&#xff0c;勾选“Add CMake to the system PATH for the current user" 点击Finish完成安装&#xff0c;在cmd窗口验证一下是否安…

C++并发之线程(std::thread)

目录 1 概述2 使用实例3 接口使用3.1 construct3.2 assigns3.3 get_id3.4 joinable3.5 join3.6 detach3.7 swap3.8 hardware_concurrency 1 概述 Thread类来表示执行的各个线程。   执行线程是指可以在多线程环境中与其他此类序列同时执行的指令序列&#xff0c;同时共享相同…

python使用pandas的常用操作

文章目录 安装导入主要数据结构常用方法和操作创建数据结构读取和写入数据数据选择和过滤数据操作基本统计分析分组和聚合合并和连接重塑数据1. pivot 和 pivot_table2. melt3. stack和 unstack 常用方法总结pandas操作excel安装相关库 读取单个工作表读取指定工作表读取多个工…

短视频矩阵系统源码---开发BS架构B/S(Browser/Server Architecture)架构

短视频矩阵系统源头开发------- 第一款叫做筷子科技&#xff0c;这个筷子科技剪辑和发布都是没有问题的&#xff0c;但是前一段时间他的剪辑发个公告&#xff0c;每个账号只能发两条&#xff0c;另外它的唯一缺点就是它成本比较高的&#xff0c;入门门槛应该在12800左右&#…

CHATGPT升级plus(已有账号前提下)

注册wildcard(虚拟卡) 注册号账号后先进行充值&#xff0c;充值后选择CHATGPT一键升级按照他的流程来即可 Wildcard网址&#xff1a;Wildcard跳转注册 填写邀请码充值时少两美金合计14&#xffe5; 邀请码&#xff1a;OL3QXTRH

【2022-2011年】地级市数字经济指数原始数据+测算dofile+结果

参照赵涛等&#xff08;2020&#xff09;的文章&#xff0c;利用熵值法对城市数字经济指数进行测算&#xff0c;包括原始数据、线性插值、回归填补3种版本下测算的数字经济指数。保留原始数据、stata代码和测算结果&#xff0c;大家可进行复现 一、数据介绍 数据名称&#x…

useState和store的区别

useState 和 useStore 是 React 应用中用于管理数据状态的两种不同的 Hook。它们在功能和用途上有一些区别&#xff1a; useState useState 是 React 提供的一个 Hook&#xff0c;用于在函数组件中添加局部状态。每个 useState 调用都会返回一个数组&#xff0c;包含两个元素…

Python爬虫协程批量下载图片

import aiofiles import aiohttp import asyncio import requests from lxml import etree from aiohttp import TCPConnectorclass Spider:def __init__(self, value):# 起始urlself.start_url value# 下载单个图片staticmethodasync def download_one(url):name url[0].spl…