js作用域

声明修饰符

let具有块级作用域

let声明的变量具有块级作用域,for循环流程控制部分(小括号内),循环体部分(大括号内)、以及函数体、大括号包裹的代码块、中使用let声明的变量仅在该块状作用域内可见.如果在全局环境中使用let声明则是全局变量.

在chrome控制台使用let声明变量虽然在当前控制台属于全局变量,但是并不会添加到window对象上

for循环流程控制部分(小括号内)使用let声明的变量循环体内也可见.并且每次循环都会声明一个新的循环变量,js引擎会'记住'上次循环变量的值,并为新声明的循环变量赋值.看下面的代码

let logfuns=[];
let addfuns=[];
for(let i=0;i<10;i++){logfuns[i]=function(){console.log(i);}addfuns[i]=function(){i++;}}
logfuns[8]();//输出8
addfuns[8]();//此时i的值变为9
logfuns[8]();//输出9
console.log(i);//报错 ReferenceError: i is not defined

由于for中用let声明的变量i,那么每次循环时都会新声明一个同名变量i(同名但不同),由于logfuns和addfuns是全局变量,且对循环中声明的变量i有引用,所以循环结束后i并没有释放,但是由于作用域限制外部无法直接访问变量i,但是函数可以访问到(这里就是js的闭包,可以理解成java的private修饰的变量用get/set访问)

const具有块级作用域

const和let一样具有块级作用域,不过const修饰的变量无法修改变量的值,而且必须声明时同时赋值,无法先声明然后再赋值.

const j=10;
const i;//会报错
i=100;

var具有函数级作用域

var声明的变量具有函数级作用域,且有声明提前(let/const没有)

var在函数内的任意位置声明,声明前的代码依然可以访问该变量,就相当于把声明提到了函数的开头.在赋值前此值都是undefined.

在chrome控用var声明变量会添加到window对象上

无修饰符声明的变量为全局变量

无论在任何位置,如果不就修饰符声明一个变量,则该变量为全局变量.

闭包 

js闭包可以实现外部访问内部变量或函数.此时的内部声明的变量依然在内存中没有释放,但是外部无法直接访问,需要通过内部函数来间接访问.

注意大量使用闭包可能导致内存占用高

上面的for循环就是一个例子,接下来再来看下面的例子,思考一下输出结果

let name="张三";
let person={name:"李四",age:"18",sayHello:function(){console.log("hello "+this.name);},sayHi:function(){return function(){console.log("hi "+this.name);}},sayNihao:function(){let that=this;return function(){console.log("ni hao "+that.name);}}
}
person.sayHello();
person.sayHi()();
person.sayNihao()();

sayHello输出'hello 李四' 这个主要看的是this指向,this指向调用者,这里是person

sayHi输出"hi undefined" 首先person.sayHi()会返回一个函数对象,这个函数对象再执行,返回函数并没有指定调用者,这时会使用全局环境.this会指向window(浏览器环境),但是由于name是let修饰,所以window.name并不存在.如果改成var修饰这里的输出结果为"hi 张三"

sanNihao输出结果为'ni hao 李四',这里是一个闭包,在外部访问内部变量that,根据上面同样的分析that指向person对象

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

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

相关文章

速盾网络:网络安全守护者

速盾网络作为一家专业的网络安全服务提供商&#xff0c;致力于为企业和个人提供全面、高效、可靠的网络安全解决方案。以下是速盾网络的主要业务介绍&#xff1a; 一、CDN加速 速盾网络拥有全球化的CDN加速网络&#xff0c;通过分布在全球各地的节点&#xff0c;为客户提供快速…

第80讲:GTID全局事务标识符的基本概念以及在Binlog中应用GTID

文章目录 1.GTID的基本概念1.1.为什么要引入GTID1.2.什么是GTID 2.开启GTID全局事务标识符的功能3.模拟产生Binlog日志观察开启GTID功能的区别3.1.模拟产生Binlog日志3.2.观察Binlog日志中的事件信息3.2.观察节点状态有什么变化3.3.观察Binlog日志会有什么变化 4.使用GTID来截取…

HuggingFace下载模型

目录 方式一&#xff1a;网页下载 方式二&#xff1a;Git下载 方式一&#xff1a;网页下载 方式二&#xff1a;Git下载 有些模型的使用方法页面会写git clone的地址&#xff0c;有些没写&#xff0c;直接复制网页地址即可 网页地址&#xff1a; ​https://huggingface.co/…

【matlab】绘制横状双组渐变柱状图

【matlab】绘制横状双组渐变柱状图

xrandr

xrandr xrandr 是用于与 X RandR 扩展进行交互的命令行工具。它允许对 X server 进行实时配置&#xff08;即无需重新启动即可使配置生效&#xff09;&#xff0c;xrandr 提供了显示模式&#xff08;如分辨率、刷新率等&#xff09;的自动检测&#xff0c;以及动态配置输出&am…

阿里云登录镜像仓库报错: Error response from daemon: Get https://

阿里云登录镜像仓库报错: Error response from daemon: Get https:// 1. 故障现象 开发反应自用笔记本连接镜像仓库是正常的,但通过服务器连接镜像仓库一直失败. 报错信息如下: Error response from daemon: Get https://registry.cn-hangzhou.aliyuncs.com/v2/: unauthoriz…

关于“Python”的核心知识点整理大全33

目录 12.8.3 将子弹存储到编组中 alien_invasion.py 注意 12.8.4 开火 game_functions.py 12.8.5 删除已消失的子弹 alien_invasion.py 12.8.6 限制子弹数量 settings.py game_functions.py 12.8.7 创建函数 update_bullets() game_functions.py alien_invasion.py…

ssm445基于SSM的学生宿舍管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本学生宿舍管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

转行小白历险记-2023.12.19 如何解决跨域问题

讨厌突如其来的破坏计划的感觉&#xff0c;真的好烦 一、跨域以及如何解决跨域问题(反向代理) 跨域 同源&#xff1a;协议、端口、域名相同 如何解决跨域问题 jsonp:<script> 不受同源策略限制跨源域资源共享 CORS:允许 Web 应用服务器进行跨源访问控制使不同的源变成同…

Inkscape SVG 编辑器 导入 Gazebo

概述 本教程描述了拉伸 SVG 文件的过程&#xff0c;这些文件是 2D 的 图像&#xff0c;用于在 Gazebo 中为您的模型创建 3D 网格。有时是 更容易在 Inkscape 或 Illustrator 等程序中设计模型的一部分。 在开始之前&#xff0c;请确保您熟悉模型编辑器。 本教程将向您展示如…

6.5 代理j ava.lang.reflect.proxy

6.5 代理proxy java.lang.reflect.proxy&#xff0c;用于创建动态代理类和实例&#xff0c; java.lang.reflect.InvocationHandler&#xff0c;使用动态代理创建实例时&#xff0c;需提供实现接口的类的实例。提供invoke方法&#xff0c;接收三个参数&#xff1a;代理对象、…

在灾难推文分析场景上比较用 LoRA 微调 Roberta、Llama 2 和 Mistral 的过程及表现

引言 自然语言处理 (NLP) 领域的进展日新月异&#xff0c;你方唱罢我登场。因此&#xff0c;在实际场景中&#xff0c;针对特定的任务&#xff0c;我们经常需要对不同的语言模型进行比较&#xff0c;以寻找最适合的模型。本文主要比较 3 个模型: RoBERTa、Mistral-7B 及 Llama-…

二叉树..

文章目录 1. 对称二叉树-力扣 101 题2. 二叉树最大深度-力扣 104 题 前中后序非递归实现通用代码&#xff1a; LinkedList<TreeNode> stack new LinkedList<>();TreeNode curr root; // 代表当前节点 TreeNode pop null; // 最近一次弹栈的元素 while (curr ! …

webrtc支持的最小宽度和高度

代码在&#xff1a;h264/sps_parser.cc // // IMPORTANT ONES! Now were getting to resolution. First we read the pic // width/height in macroblocks (16x16), which gives us the base resolution, // and then we continue on until we hit the frame crop offsets, wh…

shell——变量之字符串的截取

上篇文章讲到字符串的截取可以用字符位置索引的方式&#xff0c;即 从字符串第二个位置开始截取5个(索引值从0开始) echo "${string:1:5}" 我们还可以使用#*字符或%字符*的方式进行从左或从右的截取。 废话不多说&#xff0c;直接上例子。 #!/bin/bash str"…

微信支付宝小程序生成二维码

一、生成微信小程序二维码 微信官网API文档 1.下载到本地 Overridepublic String getWxRemovalCode() {String appId "微信小程序AppID";String secret "微信小程序AppSecret";//获取凭证String token weiXinService.getAccessToken(appId, secret);Ma…

【CSS @property】CSS自定义属性说明与demo

CSS property property - CSS: Cascading Style Sheets | MDN At 规则 - CSS&#xff1a;层叠样式表 | MDN Custom properties (–*): CSS variables - CSS: Cascading Style Sheets | MDN CSS Houdini - Developer guides | MDN &#x1f4da; 什么是property? property CSS…

Web ML 库的Transformers.js 提供文本转语音功能

JavaScript 库 Transformers.js 提供了类似 Python Transformers 库的功能&#xff0c;设计用于在 Web 浏览器中直接运行 Transformer 模型&#xff0c;而不再需要外部服务器参与处理。在最新的 2.7 版本中&#xff0c;Transformers.js 引入了增强功能&#xff0c;其中包括文本…

2023年度佳作:AIGC、AGI、GhatGPT 与人工智能大模型的创新与前景展望

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 写在前面参与规则 ✅参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff0c;任意评论&#xff08;每人最多评论…

day5 力扣合并区间--实际应用视频剪辑

以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。示例 1&#xff1a; 输入&#xff1a;intervals [[1,3],…