javascript 函数作用域 (VS Javascript 块级作用域)

Android Audio其他——数字音频接口(附) 数字音频接口 DAI,即 Digital Audio Interfaces,顾名思义,DAI 表示在板级或板间传输数字音频信号的方式。相比于模拟接口,数字音频接口抗干扰能力更强,硬件设计简单,DAI 在音频电路设计中得到越来越广泛的应用。 阅读详情

1、JavaScript 函数作用域

函数作用域定义的是函数定义的时候所处最近的上级函数上下文,而非调用的时候所处的函数环境。
函数作用域与函数定义相关,与函数调用无关。
例1:demo-1.js
function f1 () {
    var num = 1;

    function f2 () {
        var num = 2;
        f3();
    }
    f2();

    function f3 () {
        console.log(num);
    }
}
f1();
//输出:1

通过下图的“作用域关系表”可以看出,f3函数中没有定义num变量,所以只能向上(即外层环境)寻找名为num的变量。

函数f2和函数f3处于平级,所以f3只能获得函数f1对应的变量对象中的num值,即使f3在f2中调用。

作用域关系表:



相关术语:

“函数作用域”指:由执行环境对应的变量对象形成的作用域链。

什么是“执行环境”:每个函数都有自己的执行环境。
什么是“变量对象”:函数定义时内部的声明定义的变量、声明定义的函数、以及函数的参数。


2、JavaScript 函数作用域 比较 JS 块级作用域
for循环示例

2-1  

js 函数作用域:
var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10

解析:数组a中的每个数组项的值都是一个函数,函数为
function () {console.log(i); };,因为函数并没有执行,所以函数体中的 i 不会被替换成变量。
如果数组项运行后,则将 i 的值打印出来,此时 i 的值又是什么呢?
现在来创建一下作用域关系表:

如图所示,运行数组项值(即匿名函数)时,访问的 i 是全局变量对象中的 i。

但是 i 的值为什么是10呢? 
js有两种数据类型,分别是基本数据类型(undefined,null,Number,String,Boolean),
和引用数据类型(包含一项至多项数据名值对)。
区别之一是基本数据类型可以直接改写数据值,而引用数据类型包含的值是数据的引用(即数据在堆内存中的地址),不能直接改写数据值。
此时,由于没有创建新的变量 i,所以i的值每循环一次被改写一次,最终值为10。

相关术语:
js变量提升:变量的声明(不是定义)会自动提升到包含该变量的最近的函数顶部。

PS: 如果把匿名函数运行后的值传给数组,则a[6]的值为6。
如下:
var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = (function () {
    console.log(i);
  })();
}
console.log(a[6]); // 6

2-2

js 块级作用域:
var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6
相当于:
var a = [];
for (let i = 0; i < 10; i++) {
    (function () {
        a[i] = function () {  
<span style="font-family: Arial, Helvetica, sans-serif;">                    console.log(i);</span>
<span style="font-family: Arial, Helvetica, sans-serif;">              };</span>
    })();
}
a[6](); // 6

解析:同理函数作用域示例,不同处在于i的作用域仅在for循环语句块中。
每次循环都相当于再次创建一个变量,虽然变量 i 同名,但所指的值不同。


支持UE4.27、UE5.0、UE5.1、UE5.2、UE5.3、UE5.4、UE5.5的VS2022一键安装方法 本文提供了两种安装VS2022以支持UE5开发的方案。方案一通过百度网盘提供一键安装包,下载解压后以管理员身份运行批处理文件即可完成安装。方案二需从微软官网下载安装程序,通过创建包含特定参数的批处理文件来自定义安装组件。两种方案都需保持联网环境,建议先卸载旧版VS。安装完成后可测试打包UEC++项目Windows包。 阅读详情

相关推荐

centos7搭建LNMP环境-编译安装&yum安装-超详细

文章目录1. 首先了解编译安装和yum安装的区别。2. yum安装准备工作---切换阿里云yum源3. 编译安装lnmp4.yum安装lnmp5. lnmp一键安装6. 一些报错7. 笔记8. 参考文章 1. 首先了解编译安装和yum安装的区别。 windows下安装centos虚拟机,之前写过。传送门~~ 编译安装: 可以按需安装,想安在哪个目录下就安在哪个目录下。 可以设定参数 可安装自己想要的版本 yum安装: 安装的方便快捷 不需要考虑包的依赖 可以直接使用service nginx st

最美不过下雨天 9349

深入解析JavaScript中var、let、const的作用域与变量提升机制

本文深入解析JavaScript中var、let、const的作用域与变量提升机制,详细对比三者的区别与用法。通过历史背景、作用域规则、变量提升特性及实战建议,帮助开发者理解ES6引入的块级作用域概念,避免常见陷阱,提升代码质量与可维护性。

weixin_30369041的博客 460

bcftools学习笔记(一)

欢迎关注"生信修炼手册"!本篇主要介绍index, view, query, sort, reheader这五个命令。1. indexindex命令用于对VCF文件建立索...

庐州月光的博客 6010

你不知道的JS(二):函数作用域和块级作用域

包含var、let、const的详细对比和使用。还涉及函数声明和函数表达式的问题。

weixin_51670675的博客 1495

LVGL(lv_canvas)

这篇文章介绍了LVGL图形库中的lv_canvas组件,主要内容包括: lv_canvas是一个绘图缓冲区对象,提供丰富的绘图API,可以理解为LVGL的"离屏画布"。 基本使用流程:创建缓冲区->创建canvas对象->设置缓存和尺寸->进行绘图操作。 详细列举了常用的绘图函数,如绘制线条、矩形、文字、图片等。 提供了示例代码展示如何创建画布并绘制一条红色线段。 介绍了canvas的典型应用场景,如动态波形绘制、自定义控件底图等。 对比了canvas与普通img的区别

m0_49476241的博客 1026

面经-2023-哲库Zeku-数字芯片设计

面经-2023-哲库Zeku-数字芯片设计

w0shishabi的博客 3907

函数作用域和块作用域

1.函数中的作用域      1. 无论标识符声明在作用域的何处,这个标识符所代表的变量或函数都将附属于所处作用域的气泡。      2.函数作用域的含义:属于这个函数的全部变量可以在整个函数的范围内使用及复用。 function foo(a){ var b=2; //一些代码 function bar(){ //... } var c=3; } 2....

里脊的博客 5688

STC单片机 普通 I/O 口中断功能介绍和使用

STC32单片机 普通 I/O 口中断功能介绍和使用

perseverance51博客 3048

被调函数的作用域问题

<br />认知一:<br />     c语言程序设计无非是变量,操作语句,以及函数。<br />     函数为结构化设计创造了条件,函数有有参数,和无参数之分。有参数的函数主要是对函数的调用很有意义的。无参数的函数,虽可以实现c编程的结构化,但它造成了变量的混乱,即被调用函数中的变量和主函数中变量的混乱。在上万行的c程序里,可以想象这种混乱将造成多少程序的错误和团队合作的难度。<br />     我个人认为:这便是函数参数的意义之所在。<br />论证:<br />#include"stdio.h"

GIantPerson的专栏 426

基于灰度区域生长算法的红外目标检测算法matlab仿真

基于灰度区域生长算法的红外目标检测算法是一种常用的红外目标检测技术。它通过对红外图像进行灰度区域生长,找到具有相似灰度值的像素区域来检测目标。在本文中,我们将详细介绍基于灰度区域生长算法的红外目标检测算法的原理、步骤和应用。一、原理灰度区域生长算法是一种基于像素相似性的区域分割算法。它通过对图像中具有相似灰度值的像素进行聚类,将它们组合成更大的区域。灰度区域生长算法通常包括以下步骤:1.初始化:选择一个种子点作为起始点,将其作为第一个区域的中心点。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 251

[24] cuda 应用之 nppi 实现图像颜色通道变换

[24] cuda 应用之 nppi 实现图像颜色通道变换

yohnyang的博客 343

JavaScript 块级作用域 vs 函数作用域

在 JavaScript 中,作用域决定了变量的可访问范围。理解块级作用域和函数作用域的区别对于编写可靠的代码非常重要。

echo_123qq的博客 303

YOLOv11架构革新:华为VanillaNet与BiFPN深度融合的突破性改进实战指南

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有!

LXY_LOVE36的博客 136

你不知道的JS之作用域和闭包(三)函数 vs. 块级作用域

原文:你不知道的js系列 在第(二)节中提到的,标识符在作用域中声明,这些作用域就像是一个容器,一个嵌套一个,这个嵌套关系是在代码编写时定义的。 那么到底是什么产生了一个新的作用域,只有函数能做到吗?JavaScript的其它代码结构能否创建一个作用域呢? 函数作用域 观察下面的代码: function foo(a) { var b = 2; //...

weixin_30783913的博客 158

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

JS中var和let的区别

都可以用于声明变量,但它们在作用域、变量提升和重复声明等方面存在一些差异。根据需要选择合适的关键字来声明变量。声明的,在块级作用域内定义,超出该块级作用域后就不可访问。声明的变量存在变量提升,可以在声明之前访问,但值为。声明的变量没有变量提升,必须在声明之后才能访问。在同一作用域内重复声明相同的变量会导致语法错误。来避免变量提升和块级作用域的问题。声明的变量具有函数作用域,而使用。可以多次声明同一个变量,而使用。声明的变量具有块级作用域。声明的,在函数内部可见。声明的变量没有变量提升。

m0_73734137的博客 639

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

var/let/const:变量与作用域实战选型|JS 基础语法与数据操作篇

本文聚焦 JS 中var、let、const的选择问题,先厘清三者核心差异:var为函数作用域、可变量提升;let/const是块级作用域、有暂时性死区,且const仅限制变量绑定关系,不限制引用类型内部修改。再给出实用选择原则:默认用const,需重新赋值时用let,新代码弃用var。同时梳理循环用var的陷阱、const声明必赋值等常见坑,帮助开发者规范写法、避开陷阱,让代码更清晰。

中后台前端工程师,专注技术本质,用通俗语言讲清硬核知识点,持续输出成长干货。 1190

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

一篇文章带你深入预解析(var/const/let)

JavaScript中var、let和const的区别主要体现在作用域和变量特性上。var是函数作用域,存在变量提升,允许重复声明和重新赋值;let和const是块级作用域,存在暂时性死区,不允许重复声明。其中let允许重新赋值,而const必须在声明时初始化且不能重新赋值(但可修改对象属性)。建议优先使用let和const,避免var带来的作用域污染问题。理解这些差异的关键在于作用域范围(函数作用域vs块级作用域)和变量提升机制的不同表现。

s12m12的博客 389

说⼀下 var 、let、const 之间的区别

let var 是声明变量的 const 是声明常量的 var 声明的变量会声明提升 但是 const 和 let 不会 (声明提升就是声明的变量会把声明语句提到作用域的顶端 但是赋值语句留在原地) var 在全局作⽤域下声明变量会导致变量挂载在 window 上,其他两者不会 let 和 const 声明的是块级作用域 var 声明的是函数作用域 块级作用域:只要是大括号就能区分作用域 函数作用域: 只有函数才能区分作用域 代码演示如下: // console.log(num); v.

lk19910323的博客 145

变量声明与作用域

变量能在代码的哪些位置被访问使用,取决于作用域规则和变量的声明方式。var、let、const 三种变量声明写法,在作用域覆盖范围、是否可以重复声明、是否存在暂时性死区(TDZ)这些特性上都有明显区别。如果搞不懂它们之间的差异,很容易在条件代码块、for 循环搭配异步回调这类场景里,写出运行结果和自己预期不一样的代码。本文梳理了三种变量声明方式的核心要点,讲解词法作用域与作用域链、变量提升和暂时性死区的概念,同时也对循环里搭配定时器这类经典常见例题做了详细解析。

xiaofeichaichai的博客 391

【JavaScript】var,let 和 const 的区别

此时依次点击1,2,3,之所以会输出0,1,2。是因为在 for 循环内部,每次迭代都会创建一个新的块级作用域,并且将当前迭代的值绑定到该作用域内的变量上。因此,当点击li元素时,会执行console.log(i),此时每个点击事件的处理函数都可以从自己的作用域中访问到正确的i值。当点击li元素时,执行console.log(i),此时i已经是循环结束后的最后一个值3了。所以无论点击哪个li元素,输出的结果都是3。var 声明变量可以重复声明,而 let 或者 const 声明某个变量只能声明一次。

小秀的博客 656

JavaScript变量声明全面解析

从ES5时期的`var`,到ES6引入的`let`和`const`,每一次变化都旨在解决前代设计中的不足,提升代码的可读性与健壮性。值得注意的是,由`if`、`for`等语句引入的块级代码并不会限制`var`变量的可见性。循环中的独特行为:在`for`循环中使用`let`声明迭代变量时,每次迭代都会创建一个新的绑定,这对于异步操作(如`setTimeout`)尤为有用。3.保留字禁用:不能使用JavaScript的关键字或保留字(如`let`、`const`、`function`、`if`等)作为变量名。

a_goodyyy的博客 577

var与let的关键区别

var和let是 JavaScript 中用于声明变量的两个关键字,它们在作用域、变量提升、重复声明等方面有显著区别。

2403_87935758的博客 153

JavaScript变量声明:var、let、const的区别与最佳实践

在JavaScript编程中,变量声明是基础但至关重要的概念。理解变量作用域原理有助于编写更可预测的代码。传统var关键字存在函数作用域和变量提升特性,可能导致意外行为。ES6引入的let和const提供了块级作用域支持,通过暂时性死区机制将声明前访问错误提前暴露。这些改进提升了代码健壮性和可维护性,在现代前端工程实践中,推荐默认使用const声明常量,仅在需要重新赋值时使用let,基本避免var的使用。这种声明方式选择不仅关乎语法,更体现了对数据流控制的编程思维,在循环处理、模块封装和状态管理等应用场景中

weixin_31240035的博客 299

深入理解 JavaScript 中 var、let、const 的核心区别与最佳实践

通过前文对比,我们可以将varlet和const特性varletconst作用域函数作用域块级作用域块级作用域变量提升存在(提升为undefined不存在(存在暂时性死区)不存在(存在暂时性死区)重复声明允许不允许不允许初始赋值可不赋值(默认undefined可不赋值(默认undefined必须赋值重新赋值允许允许不允许(基本类型值不可变,引用类型地址不可变)在不同开发场景下的选用建议:循环场景(如 for、while)优先使用let。

q19839783889的博客 316

三分钟教你分清JS三大变量声明方式

日常写代码优先使用 const,其次选择 let,尽量少用 var,能有效减少变量相关报错。

Paheart的博客 509

let和var的区别

向量自回归(VAR)是基于数据的统计性质建立模型,VAR模型把系统中每一个内生变量作为系统中所有内生变量的滞后值的函数来构造模型,从而将单变量自回归模型推广到由多元时间序列变量组成的“向量”自回归模型。VAR模型是处理多个相关经济指标的分析与预测最容易操作的模型之一,并且在一定的条件下,多元MA和ARMA模型也可转化成VAR模型,因此近年来VAR模型受到越来越多的经济工作者的重视。在函数中声明了var,整个函数内都是有效的,比如说在for循环内定义的一个var变量,实际上其在for循环以外也是可以访问的。

qq_45814648的博客 412
下一篇: require JS入门 及 打包
SunPrincess
博客等级 码龄12年 3粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值