JavaScript-变量的作用域、let、const详解

12 篇文章 0 订阅
订阅专栏

在 javascript 中,var 定义变量实际是有作用域的。

假设在函数体中声明,则在函数体外不可以使用(可以用"闭包"实现)

测试如下代码:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        function biu(){
            var x=1;
            x=x+1;
        }
        x=x+2;
    </script>
</head>
<body>

</body>
</html>

此时浏览器会提示最后一个x缺少作用域:

如果两个函数使用了相同的变量名,只要在函数内部就不冲突

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        function biu(){
            var x=1;
            x=x+1;
        }
        function biu2(){
            var x='A';
            x=x+1;
        }
    </script>
</head>
<body>

</body>
</html>

内部函数可以访问外部函数的成员,反之则不行,示例如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        function biu(){
            var x=1;

            function biu2(){
                var y=x+1; //2
            }
            var z=y+1; //报错
        }
    </script>
</head>
<body>

</body>
</html>

假设,内部函数变量和外部函数的变量重名,在JavaScript中函数查找从自身函数开始,由'内'向'外'查找,假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        function biu(){
            var x=1;

            function biu2(){
                var x='A';
                console.log('inner'+x);
            }
            console.log('outer'+x)
            biu2();
        }
        biu();
    </script>
</head>
<body>

</body>
</html>

js 会提升变量的作用域

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        function biu(){
            var x='x'+y;
            console.log(x)
            var y='y';
        }
        //上述代码等价于
        function biu2(){
            var y;
            var x='x'+y;
            console.log(x);
            y='u'
        }
        biu();
    </script>
</head>
<body>

</body>
</html>

结果:xundefined

说明:js执行引擎,自动提升了y的声明,但是不会提升变量y的赋值,这个是在js建立之初就存在的特性,需要养成规范,所有的变量定义都放在函数的的头部,不要乱放,便于代码维护

//规范写法
        function biu2(){
            var x=1,
                y=x+1,
                z,i; //undefined
        }

全局函数

<script>
        //全局变量
        var x=1;
        function f(){
            console.log(x);
        }
        f();
        console.log(x);
    </script>

全局对象 window

<script>
        var x='xxx';
        alert(x);
        alert(window.x);//默认所有的全局变量都会自动绑定在window对象上
    </script>

alert() 这个函数本身也是一个window的变量;

<script>
        var x='xxx';
        window.alert(x);
        var old_alert=window.alert;
        window.alert=function () {
            
        }
        //此时alert()失效
        window.alert(123);
        //恢复alert
        window.alert=old_alert;
        window.alert(456);
    </script>

说明JavaScript只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,就会报错RefrenceError

规范:

由于我们所有的全局变量都会绑定到我们的window上,如果不同的js文件使用了相同的全局变量,如何能够减少冲突? ---> 定义一个唯一全局变量

<script>
        //唯一全局变量
        var BiuApp={};
        //定义全局变量
        BiuApp.name='biubiu';
        BiuApp.add=function (a,b) {
            return a+b;
        }    
</script>

把自己的代码全部放在自己定义的唯一空间名字中,降低命名冲突的问题

jQuery中就是使用的该方法:jQuery.name,简便写法:$()

局部作用域 let:

<script>
        function aaa(){
            for (var i = 0; i < 100; i++) {
                console.log(i)
            }
            console.log(i+1)// 问题:i出了这个作用域还可以使用
        }
    </script>

ES6 let关键字,解决局部作用域冲突问题

<script>
        function aaa(){
            for (let i = 0; i < 100; i++) {
                console.log(i);
            }
            console.log(i+1);
        }
    </script>

建议都使用let去定义局部作用域的变量

常量const:

在ES6之前,怎么定义常量:只要用全部大写字母命名的变量就是常量,建议不要修改这样的值

<script>
        var PI='3.14';
        console.log(PI);
        PI='3.14125';//可以改变这个值
        console.log(PI);
    </script>

在ES6引入了常量关键字const:

JavaScript变量作用域letconst(源码示例)
weixin_47556601的博客
02-12 518
大家好,今天我们分享JavaScript变量作用域JavaScript当中,var 定义的变量实际上是有作用域的 假如在函数体中声明,那么在函数体外就无法使用 举个例子: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试实例</title> <script> function wo() { var
javascript 中的 let 作用域
weixin_30336061的博客
11-09 1498
let声明了一个块级域的局部变量,并且可以给它一个初始化值。 语法EDIT let var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]]; 参数 var1,var2, …,varN变量名。变量名可以定义为任何合法标识符。value1,value2, …,valueN变量的初始化值。该值可以为任何合法表达式。 描...
JavaScript面试——作用域
weixin_47047317的博客
07-06 401
作用域 定义:作用域负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的 访问权限。 通俗来说,作用域相当于一个管理员(有自己的一套规则),他负责管理所有声明的标识符的有序查询。 词法作用域 VS 动态作用域 大部分标准语言编译器的第一个工作阶段叫作词法化(也叫单词化)。 词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的, 作用域链 ...
Javascript没有块级作用域let 和var)
大锤的专栏
07-03 1040
在java,c中,如果一个变量在一个代码块中声明定义,那么dia
JavaScript——变量作用域letconst详解
qq_52006379的博客
06-19 524
JavaScript中,var定义的变量实际是有作用域的, 假设在函数体声明,则在函数体外不可以使用~(但可以研究闭包使用) 如果两个函数使用了相同的变量名,只要在函数内部,就不冲突 由于JavaScript的函数可以嵌套,此时,内部函数可以访问外部函数定义的变量,反过来则不行: JavaScript的函数在查找变量时从自身函数定义开始,从“内”向“外”查找。如果内部函数定义了与外部函数重名的变量,则内部函数的变量将“屏蔽”外部函数的变量。 虽然是strict模式,但语句var x = 'a, ’ +
Javascript变量作用域详解
10-26
### Javascript变量作用域详解 Javascript变量作用域是编程中一个非常基础且重要的概念,理解它对于编写有效且可维护的代码至关重要。在Javascript中,变量作用域主要分为两种:全局作用域和局部作用域。全局变量...
Javascript基础之-var,letconst深入解析(一)作用域、提升
LawssssCat的博客
02-04 554
文章目录# letconst## let## const## 真正的不可变# 变量作用域## 全局变量和函数作用域变量## 提升## 编译变量## 提升 - 会出什么问 # letconst es6 引入了两种方式来申明变量 我们仍然可以使用广为传诵的 var 变量(然而你不应该继续使用它了,继续阅读来了解其中原因) 因为,现在我们有了两种更牛的工具去使用: letconst 。 #...
javascript 作用于作用域链的详解
10-19
作用域链是理解JavaScript变量访问规则的关键,它决定了在函数内部访问变量JavaScript引擎查找变量的顺序。 1. 当函数被创建时,它的内部属性[[Scope]]包含了函数被创建时的作用域链。作用域链本质上是一个对象...
javascript中的作用域和闭包详解
10-22
JavaScript中,闭包提供了对变量作用域访问和数据持久化的能力。 在JavaScript中,作用域主要分为两种:全局作用域和局部作用域。全局作用域中的变量可在代码中任何地方被访问。局部作用域是指仅在函数内部声明的...
js变量以及其作用域详解
12-12
总之,理解JavaScript变量的类型、声明、作用域和生命周期对于编写高效、可维护的代码至关重要。合理地管理变量可以减少内存浪费,避免命名冲突,并简化调试过程。在实际开发中,推荐使用`let`和`const`代替`var`,...
JavaScript块级作用域, let, const介绍
翾的博客
05-18 2250
let块级作用域ES6里增加了letconst, 声明在{}, -> “function,if ,for等” 的变量作用域被限制在块级。(严格模式下 function 变量属于块级作用域)例:{ let i = 0; } console.log(i); //报错Uncaught ReferenceError: i is not defined同时还可以解决闭包问, 例如我们为10个div
JS作用域let和var
sinat_28839863的博客
03-05 3501
由于之前C和JAVA相关语言的学习,对于JS作用域比较接收,但中间有一个注意点: JS中没有块级作用域,只有全局作用域和函数作用域;对于没有块级作用域,比如: 这里的i就是for中定义的i,如果在函数外,那么就是全局变量了,页面关闭才会销毁。 对于全局作用域和函数作用域:只用记住子域可以访问父域,而父域不能访问子域(全局作用域:参考C、java的全部变量)。 需要注意le...
JS中的块级作用域,var、letconst三者的区别
热门推荐
hot_cool的博客
10-21 4万+
首先,ECMAScript和JavaScript关系: ECMAScript是一个国际通过的标准化脚本语言。JavaScript由ECMAScript和DOM、BOM三者组成。可以简单理解为:ECMAScript是JavaScript的语言规范,JavaScript是ECMAScript的实现和扩展。1. 块作用域{ }JS作用域有:全局作用域、函数作用域。没有块作用域的概念。ECM
ES6-变量letconst和块级作用域
qq_43812731的博客
08-12 355
ES5 中,使用 var 定义全局变量 ES6 中,新增了 letconst 来定义变量let:定义局部变量,替代 var。 const:定义常量(定义后,不可修改)。 1、var:定义全局变量 看下面的代码: { var a = 1; } console.log(a); //这里的 a,指的是 区块 里的 a 上方代码是可以输出结果的,输出结果为 1。因为 var 是全局声明的,所以,即使是在区块里声明,但仍然在全局起作用。 也就是说:使用 var 声明的变量不具备块级作
一:JS作用域letconst作用域
qq_51980865的博客
04-24 637
Let命令 1:let作用类似于var,但是不同的是他们声明变量作用域有区别。 let所声明变量作用域只在let所在的代码块有效,出来这个块外界就没有用了。 for(let i=0;i<3;i++){ let i='abc'; console.log(i) } 在这几句代码中,for循环里面是一个独立的作用域,而循环体内又是一个独立的作用域。 var所声明的变量作用域确是全局都可以使用 而这一特性在特殊场合有很大的作用,建议let和var根据情况不同配合使用。 2:暂时性
Babel
最新发布
小秀的博客
09-20 435
它的主要作用是为了确保在不同浏览器和环境中运行 JavaScript 代码时保持一致的行为,尤其是提供对较新 ECMAScript 特性(如 Promise、Symbol、Object.assign 等)的支持。随着 JavaScript 标准不断更新,新的特性和功能被添加,但并不是所有的浏览器都能及时支持这些新特性。core-js 通常与 Babel 一起使用。core-js 是模块化的,这意味着开发者可以按需引入自己需要的 polyfill,而不是全部引入,这不仅能减少代码体积,还有助于提高性能。
JavaScript】LeetCode:707设计链表
weixin_45980065的博客
09-14 749
【代码】【JavaScript】LeetCode:707设计链表。
记录一个英语听力网站的开发
程序员Blue的博客
09-14 760
网站目前导入了雅思历年真的听力音频,作为日常英语听力练习的素材已足够。网站的核心功能是英语句子的精听训练,用户可以反复播放每一句话,直到完全听懂为止。播放/暂停上一句/下一句播放次数选择播放速度调整字体大小调整是否显示原文与译文是否自动播放下一句标记文章已完成上图中的绿色进度条,展示了当前卡片完成的百分比,一个卡片对应一年的剑雅真,一共16篇听力练习,在每一篇文章练习完成后,可以点击”标记已完成“,然后在下一次进入列表页时,就可以比较直观的看到学习进度。
vue 案例使用
buhuidage的博客
09-17 329
加上show-password就行。el-switch 按键的使用。
ES6 letconst详解:块级作用域变量提升对比
总结来说,ES6中的`let`和`const`为JavaScript提供了一种更明确、更安全的变量管理方式,通过控制作用域和禁止修改常量来增强代码的组织和稳定性。理解并合理运用它们是提升现代JavaScript编程水平的重要一环。
写文章

热门文章

  • 计组综合练习(期末复习大题部分适用) 7573
  • 网页前端设计-作业一(HTML5) 6304
  • 实验四 微程序控制器 5330
  • 实验4 Java类与对象实践 3664
  • 索引介绍及索引的分类 3321

分类专栏

  • 算法设计与分析(python版) 6篇
  • JavaWeb 6篇
  • CSS3 9篇
  • 数据结构与算法 11篇
  • JavaScript 12篇
  • java 13篇
  • 多线程 6篇
  • C# 12篇
  • 计算机组成原理 9篇
  • HTML5 6篇
  • MySQL 7篇
  • LeetCode经典算法题 23篇
  • GUI 3篇
  • 网络编程 2篇

最新评论

  • 实验一 运算部件实验:加法器

    芊岁芊芊岁: 佬,你的文章怎么要VIP才能看了啊

  • 数据结构-作业8

    噜噜噜鹿鹿: 第八题选b

  • LeetCode经典算法题 no.58 最后一个单词的长度

    2301_78389603: 你写 的这个方法真的是超难理解表情包

  • LeetCode经典算法题 no.58 最后一个单词的长度

    2301_78389603: 你返回的length是除去空格之外的所有单词长度呢,并不是最后一个单词的长度

  • 数据结构-作业8

    m0_73754797: 第八题错了,应该是n棵生成树吧

大家在看

  • [Unity Demo]从零开始制作空洞骑士Hollow Knight第七集:制作小骑士完整的冲刺Dash行为 651
  • (LeetCode) 997. 找到小镇的法官(哈希表)
  • Linux:虚拟文件系统/proc和self进程 573
  • [Unity Demo]从零开始制作空洞骑士Hollow Knight第六集:制作小骑士完整的跳跃落地行为 556
  • [前端学习之HTML5](04):表格与<div>标签 1

最新文章

  • 算法设计与分析(python版)-作业六
  • 算法设计与分析(python版)-作业五
  • 算法设计与分析(python版)-作业四
2022年125篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司嘉定区官网网站优化方案优化网站能带来什么效果桐城网站优化公司在哪里品创天下网站优化德阳网站优化网站性能优化是什么哈尔滨seo网站排名优化网站优化推广教程竞价优化网站盘龙网站关键词优化如何优化一个好网站网站内部优化黄骅市网站seo优化排名江苏网站首页优化优化分析澳门网站排名优化江西吉安网站优化如何提高自己的网站优化汉沽网站优化排名哪家好廊坊网站优化霸屏网站推广优化首选谷歌11网站SEO优化代运营百度网站的优化机制仙游网站优化与推广东莞服务网站优化怎么做网站优化价位表秦皇岛网站关键字优化网站推广大熊猫优化静安网站优化公司大型网站优化在线推广义马优化网站建设歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化