JavaScript三大变量声明详析

JavaScript三大变量声明详析

在JavaScript中,我们经常需要声明变量来存储和操作数据。常见的变量声明有三种:varletconst。本文将详细讲解这三种变量声明的特点和使用方法。

var

var是ES5标准引入的变量声明关键字。使用var声明的变量拥有函数作用域(function scope),即在函数中声明的变量只在该函数内部有效。如果在函数外部调用var声明的变量,会得到undefined的结果。

function foo() {
  var a = 1;
}
foo();
console.log(a); // 报错:a未定义

var的特性还包括声明提升(hoisting),即在函数内部无论在哪里声明var变量,该变量都会被视为在函数作用域顶部声明,因此可以在声明前使用该变量。

function foo() {
  console.log(a); // 输出undefined
  var a = 1;
}
foo();

值得注意的是,在var声明的变量在声明前访问时,会返回undefined,这是因为在声明前该变量已经存在,但是还未被赋值。所以,虽然变量声明会被提升,但是赋值操作仍然是按照代码中出现的先后顺序执行的。

let

let是ES6标准引入的块级作用域(block scope)变量声明关键字。块级作用域指的是在代码块(由花括号包裹的语句序列)内部声明的变量,只在该代码块内有效。与var不同的是,let不存在声明提升,所以必须先声明再使用,否则会抛出ReferenceError错误。

function foo() {
  console.log(a); // 报错:a未定义
  let a = 1;
}
foo();

let变量还有一个非常重要的特性,就是允许在同一作用域内重复声明变量。这是因为每次声明的let变量都是一个新的变量,不会影响前面已经声明的同名变量。

function foo() {
  let a = 1;
  let a = 2; // 合法
  console.log(a); // 输出2
}
foo();

但是,在let声明变量前访问该变量,同样会抛出ReferenceError错误,这与var是一致的。

const

const也是ES6标准引入的块级作用域变量声明关键字。与let类似,const声明的变量也是块级作用域的,不存在声明提升的情况。但是,与letvar不同的是,const是一个常量,一旦声明就不能更改其值。

function foo() {
  const a = 1;
  a = 2; // 报错:Assignment to constant variable.
}
foo();

但是,如果使用const声明的变量是一个对象或数组,虽然不能对该变量重新赋值,但是可以修改该变量所引用的对象或数组的属性或元素。

function foo() {
  const obj = { a: 1 };
  obj.b = 2; // 合法
  console.log(obj); // 输出{ a: 1, b: 2 }
}
foo();

示例1

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

在上面的示例中,使用var声明的i变量拥有函数作用域,即在整个for循环中只有一个变量i,循环中定义的多个setTimeout共享同一个i变量。由于setTimeout是一个异步函数,代码执行到setTimeout时,for循环已经结束,此时i的值为5。因此,无论循环执行了多少次,最终输出的结果都是5。

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

在上面的示例中,使用let声明的i变量拥有块级作用域,循环中定义的多个setTimeout都有各自的i变量。同时,由于let不存在声明提升,所以各个setTimeout函数在执行时,所引用的i变量都能正确地取到循环迭代中的当前值。因此,输出的结果是0、1、2、3、4。

示例2

const obj = { a: 1 };
obj.b = 2;
console.log(obj); // 输出{ a: 1, b: 2 }
obj = { c: 3 }; // 报错:Assignment to constant variable.

在上面的示例中,首先使用const声明了一个对象obj,然后修改了该对象的属性值,但是并没有对该变量重新赋值。这是合法的,因为const只是保证变量所引用的对象不会改变,而不是保证该对象的属性不能被修改。

然后,尝试对obj重新赋值,会得到一个Assignment to constant variable错误。这是因为const声明的变量是一个常量,一旦声明就不能更改其值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript三大变量声明详析 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 《javascript设计模式》学习笔记二:Javascript面向对象程序设计继承用法分析

    《javascript设计模式》学习笔记二:Javascript面向对象程序设计继承用法分析 一、前言 在Javascript中,对象继承有着重要的作用。深入学习Javascript的面向对象的程序设计,掌握继承用法,对于编写复杂的Javascript程序非常有用,本文将介绍Javascript中常用的继承方法和技巧。 二、原型链继承 原型链继承是Javas…

    JavaScript 2023年5月27日
    00
  • Visual Studio中js调试的方法图解

    下面我将详细地讲解“Visual Studio中js调试的方法图解”的完整攻略。 一、Visual Studio中js调试的方法图解 在 Visual Studio 中,开发者可以方便地对 JavaScript 代码进行调试,它提供了丰富的调试工具和应用程序接口。下面是使用 Visual Studio 进行 JavaScript 调试的步骤: 1. 打开一个…

    JavaScript 2023年6月11日
    00
  • 微信小程序自定义时间段picker选择器

    现在我来给您详细讲解一下“微信小程序自定义时间段picker选择器”的完整攻略。 一、前置知识 在开始讲解之前,您需要掌握微信小程序基础知识,并且熟悉微信小程序基础组件picker组件。 二、实现过程 1.准备工作 创建一个新的page或component,引入picker组件以及相关的wxss文件和js文件。 2.渲染页面 在wxml文件中,添加picke…

    JavaScript 2023年6月10日
    00
  • JavaScript 对象成员的可见性说明

    JavaScript 对象成员的可见性是指对象中的属性和方法在不同情况下是否可以被访问到。在JS中,以下是对象成员的可见性说明: 公共成员 公共成员是对象中可以被外部访问到的属性和方法。在定义对象时,可以在对象的原型上定义公共成员,例如: function Person(name, age) { this.name = name; this.age = ag…

    JavaScript 2023年5月27日
    00
  • javascript中判断一个值是否在数组中并没有直接使用

    要判断一个值是否在 JavaScript 数组中,一般可以使用 indexOf() 方法或 includes() 方法。 但是,有时候我们需要判断一个值是否在数组中,但又不想使用这两个方法。这时,我们可以使用其它方式来实现。 一种常见的方式是使用 for 循环,遍历整个数组,比较每个元素是否等于目标值。如果找到目标值,返回 true,否则返回 false。 …

    JavaScript 2023年5月27日
    00
  • Javascript中获取出错代码所在文件及行数的代码

    在Javascript代码中,有时候我们需要知道出错的代码所在的文件和行数。这个问题可以通过在代码中添加一些特定的指令来实现。下面是实现此功能的完整攻略: 步骤1: 这个功能需要运行在浏览器环境下。打开浏览器的控制台,找到“Console”面板,在里面输入以下代码: console.log(‘出错了’); throw new Error(‘错误信息’); 这…

    JavaScript 2023年5月28日
    00
  • JavaScript高级函数应用之分时函数实例分析

    JavaScript高级函数应用之分时函数实例分析 分时函数是一种常见的优化技术,它可以在页面实际需要使用某些资源时再进行加载,避免了一开始就加载所有资源,造成不必要的浪费。以下是分时函数的简单实现: function timeChunk(arr, fn, count) { const len = arr.length; // 获取要迭代的数组长度 let …

    JavaScript 2023年6月11日
    00
  • JavaScript 面向对象入门精简篇

    以下是“JavaScript 面向对象入门精简篇”的完整攻略: 什么是面向对象编程(OOP) 面向对象编程是一种编程范式,主要思想是将一些数据和对这些数据的操作封装在一起,形成一个对象,对象则是面向对象程序的基本单位,用于实现数据的组织和代码的重用。 JavaScript 是一种面向对象编程语言,其中的数据可以是任意类型的值(简单类型、对象类型),JS 中的…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部