JS(3)—— 变量声明

99 阅读2分钟

一. 标识符

标识符 :变量、函数、属性、函数参数的名称

  • 第一个字符必须为一个字母 or $ or _ 【不能以数字开头!!!】

  • 区分大小写

  • 驼峰命名法

二. 变量声明 【var 、let 、const】

JS中的变量是松散类型,即可以保存任意类型的数据。

(1) var 声明的变量
  • 不初始化的话,会保存一个默认值 undefined

  • 有函数作用域,即用 var 声明的变量会成为包含它的函数的局部变量,在函数退出时变量就会被销毁!!

  • 有变量提升

  • 可重复声明(因为有变量提升,所以可以)

  • 会成为 window对象的属性

(2)let 声明的变量
  • 有块级作用域

  • 没有变量提升,会出现 "暂时性死区" ,在let 声明之前的执行瞬间被称为"暂时性死区",在此阶段引用后面声明的变量都会报错!!!

  • 不可重复声明

  • 不会成为 window 对象的属性

  • for循环中的 let 声明

      -  <1> 用 let 声明迭代变量不会外泄,而用 var会
         for( let i = 0 ; i < 4 ; i++){
    
         }
         
         console.log(i)   // 报错!!!!未定义
         
         <2> 用 let 声明的迭代变量,js 在后台会为每一个迭代循环声明一个新的迭代变量
         
         for( let i = 0 ; i < 4 ; i++){
         
           setTimeout(()=>{console.log(i)} , 0)
         
         }   //   0 , 1 , 2 , 3
         
         区:
         
         for( var i = 0 ; i < 4 ; i++){
         
         setTimeout(()=>{console.log(i)} , 0)
         
         } //  4 , 4 , 4 , 4
         
    
(3)const 声明的变量
  • let 声明相似,声明常量

  • 必须初始化!!!

  • 声明的变量不能修改!!!

        - 不能修改指的是,变量指向的内存地址不能改变!!!
            - 如果存的是基本类型的数据,即数值、字符串、布尔值那就不可以改变
            - 如果存的是引用类型的数据,即数组、对象... ,只要不改变地址,只改变数组里面的数据                 是可以的!!
       // <1> 
       const a = 3; a = 4; console.log(a); // 报错
       // <2>
       const arr = [1,2,3]; arr = []; console.log(arr); // 报错
       // <3> 
       const arr = [1,2,3]; arr .push(2); console.log(arr); // [1,2,3,2]
       
    
是否有变量提升作用域是否可重复定义是否会成为windows对象的属性
var函数作用域可重复声明
let没有块级作用域不可重复不会
const没有块级作用域不可重复不会
(4)经典面试题
1》function foo() {
    console.log(a);
    a = 1;
}
foo(); // 报错,函数中的 "a" 并没有通过 var 关键字声明,所有不会被存放在 AO 中。【没有变量提升,执行时代码需要一步一步】
// 注意:a = 1 相当于声明了一个全局变量,即会成为 windows 对象的属性!!!2》function foo() {
    console.log(a);
    let a = 1;
}
foo(); // 报错,函数中的 "a" 并没有通过 var 关键字声明,所以不会被存放在 AO 中。3》function foo() {
    console.log(a);
    var a = 1;
}
foo(); // undefined