25 JavaScript学习:var let const

JavaScript全局变量

在这里插入图片描述

JavaScript中全局变量存在多种情况和定义方式,下面详细解释并提供相应的举例:

  1. 使用var关键字声明的全局变量:

    var globalVar = "我是全局变量";
    
  2. 未使用var关键字声明的变量会成为全局变量(不推荐使用):

    anotherGlobalVar = "我也是全局变量";
    
  3. 在全局作用域中声明的函数也是全局变量:

    function globalFunction() {
        console.log("我是全局函数");
    }
    
  4. 全局对象(window)上直接定义的属性也会成为全局变量:

    window.globalProperty = "我是全局对象的属性";
    
  5. ES6之前没有块级作用域概念,因此在if语句、for循环等代码块中声明的变量,如果没有使用var,也会成为全局变量:

    if (true) {
        blockScopedVar = "我在if块中声明,但成为了全局变量";
    }
    

需要注意全局变量可能带来的问题,如命名冲突和不可预测的值改变。因此,在编程中应当尽量避免滥用全局变量,可以使用IIFE(立即调用函数表达式)或者ES6的模块化语法,来封装变量,减少全局污染的风险。

JavaScript局部变量

在这里插入图片描述

JavaScript中的局部变量是指在函数内部或代码块内部声明的变量,只能在其所属的函数或代码块内部访问。以下是 JavaScript 中局部变量的各种情况详解和举例:

  1. 使用关键字 varletconst 在函数内部声明的变量为局部变量:
function localVariableExample() {
    var localVar = "我是局部变量";
    let anotherLocalVar = "我也是局部变量";
    const constVar = "我是一个常量局部变量";
  
    // 在这个函数内可以访问 localVar、anotherLocalVar 和 constVar
}
  1. 使用 function 关键字声明的函数内部的参数也是局部变量:
function myFunction(param) {
    // 这里的 param 是局部变量
}
  1. ES6 的箭头函数的参数也是局部变量:
const myArrowFunction = (param) => {
    // 这里的 param 是局部变量
};
  1. 在代码块内(ES6引入了块级作用域)使用 letconst 关键字声明的变量也是局部变量:
if (true) {
    let blockScopedVar = "我是块级作用域的局部变量";
    const anotherBlockScopedVar = "我也是块级作用域的局部变量";
  
    // 只能在 if 代码块内访问 blockScopedVar 和 anotherBlockScopedVar
}

局部变量只在其所属的函数或代码块内部可见,出了这个范围就无法访问。这种限制有助于避免命名冲突和提高代码的可维护性。

JavaScript块级作用域

JavaScript在ES6中引入了块级作用域,允许使用letconst声明变量,这些变量的作用域仅限于包含它们的代码块内部。

下面是关于块级作用域的详细说明和举例:

  1. 使用let声明的变量:
{
  let x = 2;
  console.log(x); // 输出 2
}
console.log(x); // 报错,因为x在块级作用域外部不可见
  1. 使用const声明的常量也具有块级作用域:
{
  const PI = 3.14;
  console.log(PI); // 输出 3.14
}
console.log(PI); // 报错,因为PI在块级作用域外部不可见
  1. for循环中的块级作用域:
for (let i = 0; i < 3; i++) {
  console.log(i); // 输出 0, 1, 2
}
console.log(i); // 报错,因为i在for循环中具有块级作用域,超出循环后不可见

块级作用域可在代码中更好地控制变量的作用范围,避免变量提升和命名冲突等问题。这种特性在编写复杂的JavaScript程序时尤其有用。

JavaScript重新定义变量

在JavaScript中,使用let关键字可以重新定义变量,而使用var关键字则不能。重新定义变量指的是在同一作用域内多次声明同一个变量名,后面的声明将覆盖前面的声明。

下面分别以letvar来说明重新定义变量的情况:

  1. 使用let重新定义变量:
let x = 10;
console.log(x); // 输出 10
let x = 20; // 可以重新定义x,不会报错
console.log(x); // 输出 20

在使用let声明变量时,可以在同一作用域内多次声明同一个变量名,后面的声明会覆盖前面的声明。

  1. 使用var重新定义变量:
var y = 30;
console.log(y); // 输出 30
var y = 40; // 重新定义y,不会报错
console.log(y); // 输出 40

在使用var声明变量时,由于var存在变量提升的特性,重新定义变量也是有效的,后面的声明会覆盖前面的声明。

总结来说,使用letvar都可以进行变量的重新定义,但建议在ES6及以后的代码中使用letconst来声明变量,以避免变量提升等问题,并更好地控制作用域。

JavaScript循环作用域

在 JavaScript 中,循环并不会创建新的作用域,这意味着在使用 var 声明变量时,循环体内部声明的变量会被提升到循环外部的作用域中。这可能导致意外的行为,特别是在使用异步操作时。

举例来说:

for (var i = 0; i < 3; i++) {
  setTimeout(function() {
    console.log(i);
  }, 100);
}

在上面的例子中,当 setTimeout 回调执行时,它会打印出 3,而不是预期的 0、1 和 2。这是因为 i 变量在循环内部被提升到了循环外部的作用域,以至于所有的 setTimeout 共享同一个 i 变量,并且在循环结束后才被赋值为 3。

为了避免这个问题,可以使用 letconst 声明变量,因为它们会在每次迭代中创建一个新的变量实例,从而解决了作用域共享的问题。

for (let i = 0; i < 3; i++) {
  setTimeout(function() {
    console.log(i);
  }, 100);
}

在这个例子中,每个 setTimeout 回调都会引用一个独立的 i 变量,因此会按照预期打印出 0、1 和 2。

HTML 代码中使用全局变量

在 HTML 中定义全局变量的方式如下:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>使用全局变量</title>
  </head>
  <body>

    <script>
      // 在 script 标签内部定义全局变量
      var globalVar = "Hello World!";

      function sayHello() {
        alert(globalVar);
      }
    </script>

    <button onclick="sayHello()">Click me</button>
  </body>
</html>

在上面的例子中,通过在 <script> 标签内部定义一个全局变量 globalVar 和一个函数 sayHello。当按钮被点击时,会调用 sayHello 函数来弹出全局变量 globalVar 的值。

在实际情况中,很少有必要在 HTML 中定义全局变量。通常,全局变量应该在 JavaScript 文件中定义,而不是嵌入到 HTML 中。可以使用 <script src="path/to/file.js"></script> 语法从 HTML 文件中链接到 JavaScript 文件,并在 JavaScript 文件中定义全局变量。例如:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>使用全局变量</title>
  </head>
  <body>

    <script src="global.js"></script>

    <button onclick="sayHello()">Click me</button>
  </body>
</html>

global.js 文件中定义全局变量和函数:

var globalVar = "Hello World!";

function sayHello() {
  alert(globalVar);
}

这样做的好处是,将 JavaScript 代码与 HTML 文件分离开来,使代码更易于管理和维护。

const 关键字

const 是 JavaScript 中用来声明常量的关键字。使用 const 声明的变量必须进行初始化,并且一旦被赋值后就不能再被修改。这意味着 const 声明的变量是不可变的。例如:

const PI = 3.14159;

在这个例子中,PI 被赋值为 3.14159,并且不能再被改变。

与 var 和 let 不同,const 声明的作用域为块级作用域,而不是函数作用域。也就是说,在使用 const 声明的变量只在其声明所在的块内部有效。

另外需要注意的是,虽然 const 声明的变量不可修改,但如果 const 声明的变量是一个对象,那么对象的属性是可以修改的。例如:

const person = {
  name: 'Alice',
  age: 30
};

// 对象的属性可以修改,但是不能重新赋值给person
person.age = 31;

总结一下,const 关键字用于声明不可变的常量,常用于声明不会被修改的值,以及避免意外的变量重复赋值。

const并非真正的常量

在 JavaScript 中,使用 const 关键字声明的变量被称为常量,因为它们在初始化后不可被重新赋值。这意味着一旦使用 const 声明变量并赋予初值后,就不能再对其进行重新赋值。

例如:

const PI = 3.14159;
PI = 3.14; // 这行代码会导致错误,因为常量PI不能被重新赋值

虽然 const 声明的变量本身是不可变的,但若该变量是一个对象,那么对象的属性是可以修改的。这意味着虽然不能给该变量赋予新的值,但仍然可以修改其属性。

例如:

const person = {
  name: 'Alice',
  age: 30
};

person.age = 31; // 这里修改了对象属性,不会导致错误

因此,虽然 const 声明的变量并非完全不可变,但通过 const 声明的变量确实可以在保证不被重复赋值的情况下,允许对对象属性进行修改。

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端】-【防止接口重复请求】

文章目录 需求实现方案方案一方案二方案三 需求 对整个的项目都做一下接口防止重复请求的处理 实现方案 方案一 思路&#xff1a;通过使用axios拦截器&#xff0c;在请求拦截器中开启全屏Loading&#xff0c;然后在响应拦截器中将Loading关闭。 代码&#xff1a; 问题&…

(刷题记录2)随机链表的复制

[刷题记录2]随机链表的复制 题目信息&#xff1a;题目思路(环境来自力扣OJ的C语言)&#xff1a;复杂度&#xff1a;代码和解释&#xff1a;1.遍历一遍原链表的同时&#xff0c;在每个原节点后面插入一个相同的新节点&#xff0c;共插入 n 个新节点。2.利用两者联系&#xff0c;…

神奇的Vue3 - 组件探索

神奇的Vue3 第一章 神奇的Vue3—基础篇 第二章 神奇的Vue3—Pinia 文章目录 神奇的Vue3了解组件一、注册组件1. 全局注册​2. 局部注册3. 组件命名 二、属性详解1. Props&#xff08;1&#xff09;基础使用方法&#xff08;2&#xff09;数据流向&#xff1a;单项绑定原则&…

ThreeJS:Mesh网格与三维变换

Mesh网格 ThreeJS中&#xff0c;Mesh表示基于以三角形为多边形网格(polygon mesh)的物体的类&#xff0c;同时也作为其它类的基类。 通过Mesh网格&#xff0c;我们可以组合Geometry几何体与Material材质属性&#xff0c;在3D世界中&#xff0c;定义一个物体。例如&#xff1a;之…

vue2(4)之scoped解决样式冲突/组件通信/非父子通信/ref和$refs/异步更新/.sync/事件总线/provide和inject

vue2 一、学习目标1.组件的三大组成部分&#xff08;结构/样式/逻辑&#xff09;2.组件通信3.综合案例&#xff1a;小黑记事本&#xff08;组件版&#xff09;4.进阶语法 二、scoped解决样式冲突**1.默认情况**&#xff1a;2.代码演示3.scoped原理4.总结 三、data必须是一个函数…

Copilot Venture Studio創始合伙人楊林苑確認出席“邊緣智能2024 - AI開發者峰會”

隨著AI技術的迅猛發展&#xff0c;全球正逐步進入邊緣計算智能化與分布式AI深度融合的新時代&#xff0c;共同書寫著分布式智能創新應用的壯麗篇章。邊緣智能&#xff0c;作為融合邊緣計算和智能技術的新興領域&#xff0c;正逐漸成為推動AI發展的關鍵力量。借助分布式和去中心…

由于找不到mfc140u.dll,无法继续执行的多种解决方法

在我们日常与计算机的密切互动中&#xff0c;或许不少用户都曾遇到过这样一个棘手的问题&#xff1a;系统突然弹出一个提示窗口&#xff0c;告知我们“找不到mfc140u.dll文件”。这个文件是Microsoft Foundation Class&#xff08;MFC&#xff09;库的一部分&#xff0c;用于支…

提升编码技能:学习如何使用 C# 和 Fizzler 获取特价机票

引言 五一假期作为中国的传统节日&#xff0c;也是旅游热门的时段之一&#xff0c;特价机票往往成为人们关注的焦点。在这个数字化时代&#xff0c;利用爬虫技术获取特价机票信息已成为一种常见的策略。通过结合C#和Fizzler库&#xff0c;我们可以更加高效地实现这一目标&…

20240502在WIN10下给X99平台上的M6000显卡安装驱动程序

20240502在WIN10下给X99平台上的M6000显卡安装驱动程序 2024/5/2 9:32 人工智能计算领域的领导者 | NVIDIA https://www.nvidia.cn/ C:\NVIDIA\DisplayDriver\552.22\Win11_Win10-DCH_64\International IMPORTANT NOTICE -- READ CAREFULLY: -------------------------------…

pmp培训机构哪个比较好,求推荐-

寻找一个自己认为比较好的PMP培训机构千万不要盲目&#xff0c;先在网上看看大家都推荐什么&#xff0c;看一下各个机构的老学员反馈&#xff0c;这些对我们的选择有非常大的帮助&#xff0c;最起码有了一些风评上的参考&#xff0c;现状就是目前线上机构的竞争比较大&#xff…

c语言从入门到函数速成(1)

温馨提醒&#xff1a;本篇文章适合人群&#xff1a;刚学c又感觉那个地方不怎么懂的同学以及以及学了一些因为自身原因停学一段时间后又继续学c的同学 好&#xff0c;正片开始。 主函数 学c时最先学的是我们c语言程序的主体函数&#xff0c;c的主函数有两种写法&#xff0c;这…

【JavaEE】Thread的方法和属性

文章目录 1、Thread的常见构造方法2、Thread的几个常见属性2.1 ID2.2 名称2.3 状态2.4 优先级2.5 是否后台线程2.6 是否存活2.7 是否被中断 3.补充说明3.1 Thread.sleep()的作用3.2 Thread.sleep()的异常处理方式 1、Thread的常见构造方法 方法说明Thread()创建线程对象Thread…

动态规划-子序列问题1

文章目录 1. 最长递增子序列&#xff08;300&#xff09;2. 摆动序列&#xff08;376&#xff09;3. 最长递增子序列的个数&#xff08;673&#xff09;4. 最长数对链&#xff08;646&#xff09; 1. 最长递增子序列&#xff08;300&#xff09; 题目描述&#xff1a; 状态表…

Linux 进程间通信之命名管道

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 命名管道 创建一个命名管道 …

LeetCode题练习与总结:删除排序链表中的重复元素--83

一、题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入&#xff1a;head [1,1,2,3,3] 输…

袁庭新ES系列17节|Spring Data Elasticsearch基础

前言 为了简化对Elasticsearch的操作Spring Data提供了Spring Data Elasticsearch。Spring Data Elasticsearch是Spring Data技术对Elasticsearch原生API封装之后的产物&#xff0c;它通过对原生API的封装&#xff0c;使得程序员可以简单的对Elasticsearch进行各种操作。接下来…

InfluxDB安装使用介绍

1.介绍 InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成&#xff0c;着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据&#xff0c;IoT行业的实时数据等场景。 2.对常见关系型数据库&#xff08;MySQL&#xff09;的基础概念对比 1…

满上! —— 十年之约#22(ROI 48%)

原创 | 刘教链 空头在忍耐了很久之后&#xff0c;趁五一劳动节东方放假发动突袭&#xff0c;把BTC&#xff08;比特币&#xff09;打到6万刀以下。这使得我们终于终结了7个月七连涨的趋势&#xff0c;确定4月以收跌结束。 4月开盘70k&#xff0c;最高72.8k&#xff0c;最低59.6…

CPU卡园区码分析计算,根据卡号计算外部密码

生活中我们可能遇到这种情况&#xff0c;比如家里的门禁卡丢失了&#xff0c;拿着家里人的去街上 复制&#xff0c;结果对方说无法复制&#xff0c;因为这种卡是CPU卡的一种&#xff0c;必须知道园区码才可以成功复制&#xff0c;这个时候&#xff0c;我们就需要请出我们的战神…

uniapp实现点击事件跳转页面

首先定义一个点击事件 这里采用的vue3的写法&#xff0c;然后写上触发事件后要跳转的路径 function jump() {uni.switchTab({url:/pages/bangong/index})} 到这里就简单的实现uniapp的点击跳转页面了