JavaScript基础2-变量

118 阅读2分钟

一、变量是什么?

变量可以理解为储存数据的容器,ECMAScript变量是松散类型的,意思是变量可以用于保存任何类型的数据。

二、变量的声明

有3个关键字可以声明变量:var、const、和let。其中var在ECMAScript的所有版本都能用,而const、和let只能在ECMAScript6及更晚的版本中使用。

三、全局变量和局部变量

  1. 使用var关键字声明变量:在函数体内声明的为局部变量,只要不是在函数体内声明的都是全局变量
  2. 使用let关键字声明变量:let和var作业差不多,但let声明的范围是块作用域,var声明的范围是函数作用域。
if(true){
    var c = 2;
    let b = 1;
}
console.log(c);//2
console.log(b);//报错
        // 这是因为let是有块级作用域的,在这里let的作用域仅限于该块内部,而var则是全局变量

var可以重复声明同变量,而let不行

var c =2;
var c =3
let q1 = 1;
let q1 = 2;//报错

let声明的变量不会在作用域中被提升

console.log(a3);//报错
let a3 = 11;

var在全局作用域中声明的变量会成为window对象的属性,而let不会

        var x = 12;
        let x2 = 13;
        console.log(window.x);//12
        console.log(window.x2);//undefined

3.使用const关键字声明:const和let基本相同,唯一一个重要的区别是用它声明变量是必须同时初始化变量,而且修改const声明的变量会导致运行时错误。const也是块级作用域,也不允许触发声明。当然const的限制只适用它指向的变量的引用。就是说如果const变量引用的是一个对象那么修改对象内部的属性并不违反const限制

        const obj = {
            name:'www'
        }
        obj.name = 'hhh'
        console.log(obj.name) //hhh
        obj = {} //报错

四、var声明提升

使用var声明的变量会自动提升到作用域(全局或函数内)顶部,可以在变量声明前使用,不过是得到undefined(表示声明了,但没有赋值),只有代码运行到声明那行代码才会执行赋值操作。

console.log(c);//undefined
var c = 12;
function foo(){
    console.log(a)//undefined
    var a = 10
}
foo()