变量声明.png
ECMAScript的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。

变量提升

ES5中变量声明的方式

var

var声明的变量的作用域是函数作用域。

function

函数声明要优于变量声明

特点:

  1. 允许重复声明。
  2. 存在声明提升,自动提升到所在作用域的顶端。但是变量赋值不会提升。
  3. 没有块级作用域。
  4. varfunction 声明的全局变量与顶层对象的属性是等价​的。
//1. 允许重复声明。
var a = 2;
var a = 3;
console.log(a); //3

function foo() {
    console.log("1");
}
function foo() {
    console.log("2");
}
foo(); //2

// 2.存在声明提升
console.log(b); //undefined
var b = 2; 

//4. 顶层对象的属性与全局变量是等价​。
var c =3;
console.log(window.c); //3

ES6中变量声明的方式

let

const

1.给const修饰的标识符被赋值之后, 不能修改
2.声明变量的时候必须初始化。
3.常量的含义是指向的对象不能修改, 但是可以改变对象内部的属性。

const obj = {
  name: 'black',
};
console.log(obj);
//{ name: 'black' }
obj.name = 'red';
console.log(obj);
// { name: 'red' }

class

特点:

  1. 不允许重复声明
  2. 不存在声明提升
  3. 存在块级作用域​
  4. letconstclass 声明的全局变量,不属于顶层对象的属性

隐式声明

作为全局变量存在(即便它在函数内定义)但不会声明提前。

var a = 3;
function foo() {
    console.log(a); //3
    a = 5;
}
console.log(a); //3
foo();
console.log(a); //5

梁柱
135 声望12 粉丝