开发者社区 问答 正文

JavaScript变量及作用域

变量就是对底层数据的引用,并不是数据本身;比如:一个人叫张三,张三只是他的名字,并不是他这个人本身。
java script中的变量分为三种:let(块级变量)、var(函数级变量)、const(常量,块级引用不可变)

一、let和var

let作用于块级,var作用于函数级

1.let

let声明的变量作用于块级,如下代码,能够正常输出


  
  • function abc(){
  • let name = "猿分享";
  • console.log(name);
  • }
  • abc();

将代码改成


  
  • function abc(){
  • {
  • let name = "猿分享";
  • }
  • console.log(name);
  • }
  • abc();

就会报错说name is not defined

2.var

var是函数级变量,作用于整个函数


  
  • function abc(){
  • {
  • let name = "猿分享";
  • }
  • console.log(name);
  • }
  • abc();

将之前这段代码改成如下


  
  • function abc(){
  • {
  • var name = "猿分享";
  • }
  • console.log(name);
  • }
  • abc();

可以正常输出,说明var声明的变量作用于整个函数

3.变量提升问题

var声明的变量会提升到函数顶部,而let声明的变量不会提升
如下代码


  
  • function abc(){
  • {
  • var name = "猿分享";
  • }
  • console.log(name);
  • }
  • abc();

在程序内部就相当于这样,所以在上面用var声明的变量可以正常输出


  
  • function abc(){
  • var name;
  • {
  • name = "猿分享";
  • }
  • console.log(name);
  • }
  • abc();

let声明的变量不会这样提升

二、const和let

const的作用域和let一样都是作用域块级,也不存在变量提升,但是const声明的相当于常量,它声明后引用是不可变的。
比如先声明name为abc,然后改成def


  
  • const name = "abc";
  • name = "def";
  • console.log(name);

这样就会报错Assignment to constant variable.,这里改变了引用。
如下例子


  
  • const user = {
  • name: "张三",
  • age: 18
  • }
  • user.sex = "男";
  • console.log(user);

可以正常输出,这里只是改变了值,并没有改变引用。

展开
收起
chenchuan 2018-08-31 22:54:54 2128 分享 版权
阿里云 AI 助理回答

JavaScript中的变量与作用域

在JavaScript中,变量是存储数据值的占位符,它们允许你引用底层数据而不是直接操作数据本身。根据声明方式的不同,变量的行为和作用域有所差异。主要分为三种类型:letvarconst

1. let (块级变量)

  • 作用域let 声明的变量具有块级作用域,这意味着变量只在其声明的代码块(如大括号内)内有效。

  • 示例

    function exampleLet() {
    {
      let name = "猿分享";
      console.log(name); // 正常输出 "猿分享"
    }
    console.log(name); // 报错 ReferenceError: name is not defined
    }
    exampleLet();
    
  • 变量提升:与var不同,let声明的变量不会发生变量提升现象,即在声明前访问会报错。

2. var (函数级变量)

  • 作用域var 声明的变量具有函数作用域或全局作用域。在函数内部声明时,它对整个函数可见;在函数外部声明,则为全局变量。

  • 示例

    function exampleVar() {
    {
      var name = "猿分享";
    }
    console.log(name); // 正常输出 "猿分享",因为var变量提升至函数作用域顶部
    }
    exampleVar();
    
  • 变量提升var声明的变量会被提升到其所在作用域的顶部,但赋值操作保持原地。

3. const (常量)

  • 作用域与提升const 同样具有块级作用域,且不支持变量提升,意味着必须先声明后使用,并且声明后其引用不可更改。

  • 不变性

    • 直接改变常量的值会导致错误,例如 const name = "abc"; name = "def"; 将抛出错误 "Assignment to constant variable."。
    • 然而,如果const声明的是一个对象或数组,虽然不能改变引用,但可以修改其属性或元素,因为这不被视为改变引用本身。
    const user = { name: "张三", age: 18 };
    user.sex = "男"; // 允许,因为这是修改对象属性,不是改变user的引用
    console.log(user); // 输出带有新属性的对象
    

综上所述,letvar 的主要区别在于作用域和变量提升行为,而 const 则用于定义不可变的引用,确保数据的安全性和程序的可预测性。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答