声明变量的三个关键字

ECMAScript变量是松散类型的,因此变量可以保存任何类型的数据。var在ECMAScript的所有版本中都可以使用,但是const和let只能在ECMAScript6及更晚的版本中使用

一 var关键字

1 var声明提升

使用这个关键字声明的变量,会自动提升到函数作用域的顶部

<script>
        function foo(){
            console.log(age);
            var age = 26;
        }
        foo()
</script>
//控制台会输出undefined    

之所以不会报错,因为ECMAScript运行时把它看成等价的如下代码:

function foo(){
            var age;
            console.log(age);
            age = 26;
        }
        foo()

2 作用域范围

  1. 使用var操作符定义的变量会成为包含它的函数的局部变量,其作用域的范围是函数作用域

function text(){
    var message = 'hi';
}
text();
//调用text()函数,它会创建这个变量并给它赋值。调用后变量即被销毁
  1. 在函数内定义变量时,省略var操作符,可以创建一个全局变量

虽然可以省略,从而创建全局变量,但不推荐这么做。在局部变量中定义的全局变量很难做到维护,也会造成困扰。因为不能一下子断定省略的var是不是有意而为之。
在严格模式下,如果像这样给未声明的变量赋值,则会抛出ReferenceError

二 let关键字

1 作用域范围

let声明的范围是块作用域,而var声明的作用域是函数作用域

if(true){
    var name = 'Matt';
    console.log(name);//Matt
}
console.log(name)//Matt

if(true){
    let name = 'Matt';
    console.log(name);//Matt
}
console.log(name)//EeferenceError:age没有定义

因为let声明变量的作用域仅限于该if块内部,所以不会在块外边再使用

块作用域是函数作用域的子集,因此是用于var的作用域限制也同样适用于let

2 声明冗余报错的问题

var name;
let name;//SyntaxError
let age;
var age;//SyntaxError

这俩个关键字声明的并不是不同类型的变量,他们只是指出变量在相关作用域中如何存在

3 全局声明

重点!重点!重点!

使用let在全局作用域中声明的变量不会成为window对象的属性(var声明的变量则会)

    var name = 'Matt';
    console.log(window.name);//Matt
    let age = 18;
    console.log(window.age);//undefined

三const关键字

1 使用方法

  1. const的行为与let基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量

  1. 尝试修改const声明的变量会导致运行时错误

const age = 26;
age = 36;//TypeError:给常量赋值
  1. 不能作为迭代变量


整理不易,对您有帮助的,希望可以点赞支持

猜你喜欢

转载自blog.csdn.net/qq_67896626/article/details/129331920