var
-
如果有人问使用 var 定义的变量有什么特点,我相信很多人都会说它定义的变量是全局变量,其实这个说法是不严谨的,请看下面的解释
-
var 是 ES6之前 js 用来声明变量的方法,它具有如下特点:
-
var 定义的变量的作用域是函数作用域,在函数内用 var 声明的变量,只在这个函数内有效,请看下面的代码
function f() { var a = 1; } //加上下面这句调用函数的语句,结果也是一样的 //f(); console.log(a); //ReferenceError: a is not defined
需要特别强调的是,这里的 a 是在函数内用 var 定义的,函数内和 var 缺一不可,同时请注意和下面这几个例子相比较
//这个例子没有写函数 for (var i = 0; i < 3; i++) { continue; } console.log(i); //3
也就是说,var 定义的变量的作用域是以函数为单位的,而不是我们通常所说的,用 var 定义的变量就是全局变量,如果一个用 var 定义的变量不在任何函数内,我们才能说它是全局变量
function f() { var a = 1; } f(); console.log(a); //ReferenceError: a is not defined
function f() { var a = 1; } //f(); console.log(a); //ReferenceError: a is not defined
function f() { a = 1; } f(); console.log(a); // 1
function f() { a = 1; } //f(); console.log(a); //ReferenceError: a is not defined
【总结】:只要在函数内声明变量的时候,使用了 var 关键字,那么这个变量就是局部变量;如果没有使用 var 关键字,那么只有在这个函数被调用之后,这个变量才是全局变量(函数内部定义的方法和变量,要等到函数执行过以后,才会真正定义)
-
var 定义的变量存在变量提升的现象,也就是在未声明之前即可使用,只不过这时变量的值是
undefined
function test(){ console.log(a); //undefined var a=3; } test();
-
let
-
let 也是用来声明变量的,但是它所声明的变量只在 let 命令所在的代码块内有效,请看下面两个例子,注意代码块和函数的区别
{ //是否初始化并不影响这里要说明的问题,因此也可以不初始化 let a = 1; var b = 2; } //ReferenceError: a is not defined(引用错误:a没有定义) console.log(a); console.log(b); //2
{ let a = 0; var b = 1; } function test(){ console.log(a); //ReferenceError: a is not defined console.log(b); //1 } test();
-
let 声明的变量的特点
-
变量所属的作用域是块级作用域(在 ES6 之前,js只存在函数作用域以及全局作用域)
-
不存在变量提升,即变量在声明之前不可使用
-
不能重复定义,即使用 let 关键字重复声明同一个变量
let a = 1; let a = 2; //SyntaxError: Identifier 'a' has already been declared console.log(a);
-
存在暂时性死区
暂时性死区的本质就是,只要一进入当前作用域,当前作用域的所有变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量
-
const
-
const 是用来声明常量,且声明的常量是不允许改变的,而且在声明的同时必须初始化
-
const 与 let 一样,其定义的变量都属于块级作用域,不存在变量提升,不允许重复定义,同时也存在暂时性死区
-
const 的本质: 使用 const 定义的变量并非所有的都是常量,当我们使用 const 来定义常量对象或常量数组时,常量对象或常量数组里的内容其实是可变的,只是不能对这个常量对象或常量数组进行重新赋值的操作。请看下面的代码
// 创建常量对象 const car = {type:"Fiat", model:"500", color:"white"}; car.color = "red"; //修改属性 car.owner = "Johnson"; //添加属性 //TypeError: Assignment to constant variable car = {type:"Volvo", model:"EX60", color:"red"}; //错误
// 创建常量数组 const cars = ["Saab", "Volvo", "BMW"]; cars[0] = "Toyota"; //修改元素 cars.push("Audi"); //添加元素 //TypeError: Assignment to constant variable cars = ["Toyota", "Volvo", "Audi"]; //错误