JavaScript 作用域 与 var、let、const关键字

news2024/9/20 18:41:07

目录

一、JavaScript 作用域

1、全局作用域

2、函数作用域

3、块级作用域

4、综合示例

5、总结

二、var、let、const

1、var 关键字

2、let 关键字

3、const 关键字

4、总结

5、使用场景


一、JavaScript 作用域

在JavaScript中,作用域是指程序中可访问变量(对象和函数同样也是变量)的集合

作用域决定了变量的可见性和生命周期;

简单来说(个人理解):作用域就是指,变量能够正常被访问的区域;

有三种主要的作用域类型:全局作用域、函数作用域、块级作用域;

1、全局作用域

  • 当在函数外部声明变量时,默认在全局作用域中,即为全局变量;
  • 该变量可以在整个程序的任何地方(在所有脚本和函数中)使用, 直到它们被销毁或程序结束;
  • 全局变量通常在浏览器环境中由window对象持有;
  • window对象的内置属性都拥有全局作用域;
<script>
    var myName  = "zyl";
    console.log("全局作用域中的myName :", myName );
    console.log(window.myName );
</script>

 注意:在全局作用域中声明的myName变量,被window对象持有;

2、函数作用域

  • 当在函数内部声明变量时,即在函数作用域中;
  • 该变量只在该函数内部可见;
  • 函数作用变量在函数执行完毕后会被销毁,除非它们被返回或以其他方式被外部作用域引用;
<script>
    function fn(){
        var myName = "zyl";
        console.log("函数作用域中的myName:", myName);
    }
    fn();
    console.log(myName);    //ReferenceError: myName is not defined
</script>

注意:在函数作用域中声明的变量只在函数内部可见,函数外面时访问不到的; 

3、块级作用域

  • JavaScript ES6 引入了块级作用域,通过let和const关键字声明变量,它们只在声明所在的代码块内可见;
  • 这种作用域提供了更细粒度的控制,可以避免全局污染;
  • 块级作用域在循环内部声明变量时特别有用;
<script>
    {
        let myName  = "zyl";
        console.log("块级作用域中的myName :", myName );
    }
    console.log(myName);
</script>

 注意:在块级作用域中声明的变量,只在该块内可见,代码块的外面是访问不到的;

4、综合示例

<script>
    var globalVar = "全局作用域";
    function fn(){
        var fnVar = "函数作用域";
        {
            let blockVar = "块级作用域";
            console.log("代码块中,访问块级作用域中的变量,blockVar:", blockVar);
            console.log("代码块中,访问函数作用域中的变量,fnVar:", fnVar);
            console.log("代码块中,访问全局作用域中的变量,globalVar:", globalVar);
        }
        // console.log("函数中,访问块级作用域中的变量,blockVar:", blockVar);    // 报错:ReferenceError: blockVar is not defined
        console.log("函数中,访问函数作用域中的变量,fnVar:", fnVar);
        console.log("函数中,访问全局作用域中的变量,globalVar:", globalVar);
    }
    fn();
    // console.log("函数外部,访问块级作用域中的变量,blockVar:", blockVar);  // 报错:ReferenceError: blockVar is not defined
    // console.log("函数外部,访问函数作用域中的变量,fnVar:", fnvar);    // 报错:ReferenceError: fnvar is not defined
    console.log("函数外部,访问全局作用域中的变量,globalVar:", globalVar);
</script>

5、总结

  • 块级作用域中声明的变量,只能够在该块内被访问;
  • 函数作用域中声明的变量,只能在函数内部,以及该函数内部的代码块中被访问;
  • 全局作用域中声明的变量,能在任何地方被访问;

二、var、let、const

在JavaScript中,声明变量需要使用varletconst关键字,这三者有和特点和区别?

1、var 关键字

(1)声明全局变量

使用 var 关键字在全局作用域中声明的变量,即为全局变量;

改变了被window对象持有;

可以在任何地方被访问;

var price = "10.00"
console.log("全局作用域,price值为:", price);
console.log("window对象的price,值为:", window.price);

function fn() {
    console.log("函数作用域,price值为:", price);
    {
        console.log("块级作用域,price值为:", price);
    }
}
fn();

(2)声明局部变量

使用 var 关键字在函数作用域中声明的变量,即为局部变量;

只能在函数内,包括函数内的代码块中被访问;

不能在函数作用域外被访问;

function fn() {
    var price = "10.00"
    console.log("函数作用域,price值为:", price);
    {
        console.log("块级作用域,price值为:", price);
    }
}
fn();

console.log("全局作用域,price值为:", price);      // 报错:ReferenceError: price is not defined

(3)存在变量提升

使用var关键字声明的变量,存在变量提升;

存在变量提升:在代码执行前,变量的声明已经被提升到了函数的顶部,但没有初始化;

console.log("使用var声明之前,price值为:", price);
var price = "10.00"
console.log("使用var声明之后,price值为:", price);

注意:

这里在使用var声明price之前,打印输出price并没有报错,而是输出了undefined;

这是因为使用var关键字声明的变量,存在变量提升;

执行下面的代码时:

...
console.log("使用var声明之前,price值为:", price);
var price = "10.00"
...

相当于执行:

...
var price;
console.log("使用var声明之前,price值为:", price);
price = "10.00"
...

(4)声明的变量,可以被重新赋值

使用var关键字声明的是变量,可以被重新赋值;

var price = "10.00"
console.log("使用var声明变量price,值为:", price);

price = "9.99"
console.log("修改后的price,值为:",price);

(5)声明的变量,可以被重新声明

使用var关键字重复声明同一个变量时,后续的声明会覆盖之前的;

var price = "10.00"
console.log("var声明变量price,值为:", price);

var price = "9.99"
console.log("var声明变量price,值为",price);

(6)一次可以声明多个变量

使用var关键字一次可以声明多个变量,中间用逗号隔开即可;

var price = "10.00", conut = 20;
console.log("var声明变量price,值为:", price);
console.log("var声明变量count,值为",conut);

2、let 关键字

(1)声明块级作用域变量

使用let关键字声明的变量只在let命令所在的代码块内部有效,即let所在的{ }内;

function fn() {
    let count = 99;
    console.log("count值为:", count);
    {
        let count = 88;
        console.log("count值为:", count);
    }
    console.log("count值为:", count);
}
fn();

(2)不存在变量提升

使用let关键字声明的变量不存在变量提升,只能在声明之后被访问;

如果在声明之前访问变量,将会抛出一个引用错误;

// console.log("使用let声明之前,count值为:", count);     // 报错:ReferenceError: Cannot access 'count' before initialization
let count = 99;
console.log("使用let声明之后,count值为:", count);

(3)声明的变量,可以被重新赋值

使用let关键字声明的变量,可以被重新赋值;

let count = 99;
console.log("使用let声明变量count,值为:", count);

count = 88
console.log("修改后的count,值为:", count);

(4)声明的变量,不能被重新声明

使用let关键字声明的变量,不能被重新声明;

let count = 99;
console.log("使用let声明变量count,值为:", count);

let count = 88      // 报错: SyntaxError: Identifier 'count' has already been declared 

(5)一次可以声明多个变量

使用let关键字一次可以声明多个变量,中间用逗号隔开即可;

let price = "10.00", conut = 99;
console.log("let声明变量price,值为:", price);
console.log("let声明变量count,值为",conut);

3、const 关键字

const关键字的特点与let相似,主要区别在于const关键字用来声明只读的变量,即常量,不能被重新赋值;

(1)声明块级作用域变量

使用const关键字声明的变量只在const命令所在的代码块内部有效,即const所在的{ }内;

function fn() {
    const product = "苹果";
    console.log("product值为:", product);
    {
        const product = "西瓜";
        console.log("product值为:", product);
    }
    console.log("product值为:", product);
}
fn();

(2)不存在变量提升

使用const关键字声明的变量不存在变量提升,只能在声明之后被访问;

如果在声明之前访问变量,将会抛出一个引用错误;

// console.log("使用const声明之前,product值为:", product);     // 报错:ReferenceError: Cannot access 'product' before initialization
const product = "苹果";
console.log("使用const声明之后,product值为:", product);

(3)声明的变量,不能被重新赋值

使用const关键字声明的变量,不能被重新赋值;

该变量是只读的,即常量;

const product = "苹果";
console.log("使用const声明变量product,值为:", product);

product = "西瓜";   // 报错:TypeError: Assignment to constant variable.

(4)声明的变量,不能被重新声明

使用const关键字声明的变量,不能被重新声明;

const product = "苹果";
console.log("使用const声明变量product,值为:", product);

const product = "西瓜";   // 报错:SyntaxError: Identifier 'product' has already been declared

(5)一次可以声明多个变量

使用const关键字一次可以声明多个变量,中间用逗号隔开即可;

const price = "9.99", count = 99,  product = "苹果";
console.log("使用const声明变量price,值为:", price);
console.log("使用const声明变量count,值为:", count);
console.log("使用const声明变量product,值为:", product);

4、总结

(1)var、let、const 的不同点

序号不同点说明
1变量作用域

var用来声明全局变量和局部变量;

let和const用来声明块级作用域中的变量;

2变量提升

var声明的变量存在变量提升;

let和const声明的变量不存在变量提升(只能在声明之后访问);

3重新赋值

var和let声明的变量可以被重新赋值;

const声明的变量不能被重新赋值(只读,常量);

4重新声明

var声明的变量可以被重新声明;

let和const声明的变量不能被重新声明;

(2)var、let、const 的相同点

var、let、const 都用来声明变量;

var、let、const 都可以同时声明多个变量;

5、使用场景

var、let、const 三个关键字的使用取决于声明变量的场景;

  • 声明常量(只读的变量),用const;
  • 声明块级作用域中的变量,用let;
  • 声明全局变量,用var;
  • 优先级:const > let > var;

通常推荐使用 let 和 const,它们提供了更好的作用域管理,减少了由变量提升导致的错误;

======================================================================

每天进步一点点~~!

记录一下这个JavaScript中的这个基础内容!

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

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

相关文章

网络编程:TCP

一、tcp编程 注意 1.数据本身有顺序 2.发送和接收次数不需要对应 3. 1. C/S 模式 》服务器/客户端模型 server:socket()-->bind()--->listen()-->accept()-->recv()-->close() client:socket()-->connect()-->send()-->close(); int on 1; setso…

如何学好C++?

首先&#xff0c;对于零基础的想学习C的同学&#xff0c;我想要你们先明白一件事&#xff1a;C是一门极为复杂且难以掌握的编程语言。因此推荐在学习C之前可以先去学习C语言&#xff0c;在拥有了一定的知识储备和编程能力后再学习C会更加的高效和相对轻松。 下面推荐从三个方面…

源码编译安装 LAMP

目录 2.1Apache 网站服务基础 2.1.1 Apache 简介 1.Apache 的起源 2.Apache 的主要特点 2.1.2 安装 httpd 服务器 1.准备工作 2.源码编译及安装 3.确认安装结果​编辑 4.优化执行路径 5.添加 httpd 系统服务 2.2 httpd 服务器的基本配置 2.2.1 Web 站点的部…

锅总反驳李彦宏说的“不要卷模型,要卷应用”

李彦宏的观点是大家不要卷模型&#xff0c;要卷应用&#xff0c;但我认为这种看法是荒谬的。以下是24条反驳李彦宏观点的论点和论据&#xff1a; 模型的准确性直接决定应用的质量和用户体验&#xff1a; 论据&#xff1a;在自然语言处理、计算机视觉等领域&#xff0c;模型的准…

安全求交集PSI

安全求交集定义 求交集的PSI&#xff1a;交集可以被两方看见或其中一方看见&#xff0c;非交集进行保护有两方的PSI半诚实的PSI&#xff1a;攻击者要严格遵守协议&#xff0c;在此基础上得到他人的秘密是做不到的 Two-Party Semi-Honest PSI 挑战一&#xff1a;隐藏非交集元素…

纯前端如何实现Gif暂停、倍速播放

前言 GIF 我相信大家都不会陌生&#xff0c;由于它被广泛的支持&#xff0c;所以我们一般用它来做一些简单的动画效果。一般就是设计师弄好了之后&#xff0c;把文件发给我们。然后我们就直接这样使用&#xff1a; <img src"xxx.gif"/>这样就能播放一个 GIF …

offer题目33:判断是否是二叉搜索树的后序遍历序列

题目描述&#xff1a;输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。例如&#xff0c;输入数组{5,7,6,9,11,10,8},则返回true,&#xff0c;因为这个整数是下图二叉搜索树…

作业/数据结构/2024/7/8

链表的相关操作作业&#xff1a; 1】 按值修改 2】按值查找&#xff0c;返回当前节点的地址 &#xff08;先不考虑重复&#xff0c;如果有重复&#xff0c;返回第一个&#xff09; 3】 逆置(反转) 4】释放链表 main.c #include "head.h"int main(int argc, con…

6.Python学习:异常和日志

1.异常的抓取 1.1异常的概念 使用异常前&#xff1a; print(1/0)使用异常后&#xff1a;错误提示更加友好&#xff0c;不影响程序继续往下运行 try:print(10/0) except ZeroDivisionError:print("0不能作为分母")1.2异常的抓取 第一种&#xff1a;如果提前知道可…

微软清华提出全新预训练范式,指令预训练让8B模型实力暴涨!实力碾压70B模型

现在的大模型训练通常会包括两个阶段&#xff1a; 一是无监督的预训练&#xff0c;即通过因果语言建模预测下一个token生成的概率。该方法无需标注数据&#xff0c;这意味着可以利用大规模的数据学习到语言的通用特征和模式。 二是指令微调&#xff0c;即通过自然语言指令构建…

核密度估计KDE和概率密度函数PDF(深入浅出)

目录 1. 和密度估计&#xff08;KDE&#xff09;核密度估计的基本原理核密度估计的公式核密度估计的应用Python中的KDE实现示例代码 结果解释解释结果 总结 2. 概率密度函数&#xff08;PDF&#xff09;概率密度函数&#xff08;PDF&#xff09;是怎么工作的&#xff1a;用图画…

数据类型及数据块认知

西门子STEP7编程语言 梯形图(LAD) 功能块图(FBD) 语句表(STL) 其中梯形图和功能块图可以相互转换 CPU常用数据区 信号输入区 I 信号输出区 Q 程序中表现形式&#xff0c;IX.X/QX.X;IWX/QWX-访问的是CPU输出输入过程映像区 另一种形式IWX:P/QWX:P-访问的是信号端口地址&#xf…

idea推送到gitee 401错误

在idea上推送时遇到这样的问题&#xff0c;解决方法如下&#xff1a; 在https://的后面加上 用户名:密码 然后再提交就ok啦&#xff01;

285个地级市出口产品质量及技术复杂度(2011-2021年)

出口产品质量与技术复杂度&#xff1a;衡量国家竞争力的关键指标 出口产品质量是衡量国内企业生产的产品在国际市场上竞争力的重要标准。它不仅要求产品符合国际标准和目标市场的法律法规&#xff0c;而且需要保证产品质量的稳定性和可靠性。而出口技术复杂度则进一步体现了一…

Python神经模型评估微分方程图算法

&#x1f3af;要点 &#x1f3af;神经网络映射关联图 | &#x1f3af;执行时间分析 | &#x1f3af;神经网络结构降维 | &#x1f3af;量化图结构边作用 | &#x1f3af;数学评估算法实现 &#x1f36a;语言内容分比 &#x1f347;Python随机梯度下降算法 随机梯度下降是梯度…

nodejs安装配置详解

一、下载Node.js安装包 官网下载链接[点击跳转] 建议下载LTS版本&#xff08;本教程不适用于苹果电脑&#xff09; 二 、安装Node.js 2.1 下载好安装包后双击打开安装包&#xff0c;然后点击Next 2.2 勾选同意许可后点击Next 2.3 点击Change选择好安装路径后点击Next&#x…

使用微pe装系统

本文仅作为记录&#xff0c;不作为教程。 今天心血来潮想下点游戏玩玩&#xff0c;一看之前分的200gc盘已经红了&#xff0c;再加上大学之后这个笔记本已经用得很少了&#xff0c;于是打算重装电脑。 参考: 微PE辅助安装_哔哩哔哩_bilibil… 1.下载微pe和win10系统到U盘 我这…

18.按键消抖模块设计(使用状态机,独热码编码)

&#xff08;1&#xff09;设计意义&#xff1a;按键消抖主要针对的时机械弹性开关&#xff0c;当机械触点断开、闭合时&#xff0c;由于机械触点的弹性作用&#xff0c;一个按键开关在闭合时不会马上稳定地接通&#xff0c;在断开时也不会一下子就断开。因而在闭合以及断开的瞬…

Java PKI Programmer‘s Guide

一、PKI程序员指南概述 PKI Programmer’s Guide Overview Java认证路径API由一系列类和接口组成&#xff0c;用于创建、构建和验证认证路径。这些路径也被称作认证链。实现可以通过基于提供者的接口插入。 这个API基于密码服务提供者架构&#xff0c;这在《Java密码架构参考指…

Windows C++ vs2022环境中下载、安装和使用osmesa

第一步&#xff1a;安装 MinGW-w64 请参考这篇文章进行安装&#xff1a; 在Windows中安装MinGW-w64最新版本 第二步&#xff1a;安装DirectX SDK 请参考这篇文章进行安装&#xff1a; 下载安装Microsoft DirectX SDK(June 2010) 第三步&#xff1a;安装Windows SDK 请参考这篇…