Shyno
Don't be shy,no problem!

变量声明

声明方式

    显式声明:用命令声明一个变量,比如(var,let,const)

    隐式声明:不用命令声明

        var a = 1       //显式声明
        b=1     //隐式声明
        console.log('jjjj',a,b)    //jjjj  1 1

   两者的区别

       1.隐式声明不需要用命令

       2:显式声明可以不赋值,隐式不行

       var a 
       console.log('a',a)   //a undefined
        b
       console.log('b',b)   //b is not defined

原因:

显式声明是语法支持,即当我用var声明后,会默认给个undefinde值.所以"var a"实际上是

var a
a =undefined

 但是隐式声明实际上利用了js的底部逻辑,即当我发现一个变量时,我先回看它存不存在,如果不存在再看它有没有被赋值,如果没赋值,说明它不需要被保存,那我直接报错.如果需要被赋值,那么我则临时给个空间保存起来,相当于是声明了.所以,隐式声明需要被赋值

      3.显式声明和隐式声明的变量都是window的属性,但是隐式声明的变量可以被delete

       var a =1
       console.log('a',a,window.a)   //a 1 1
        b =2
       console.log('b',b,window.b)   //b 2 2

     删除

       var a =1
       delete window.a
        console.log('a',a,window.a)   //a 1 1
        b =2
        delete window.b
        // console.log('b',b)//b is not defined
       console.log('b',window.b)   //undefined

 这里其实还发现一个点,隐式声明的变量被保存在window中,而且当window中的变量被删除后,栈中也没有该变量了.而显式变量,只要你声明了,就不好删除了.基本一直都在.

重复声明

重复声明以后者为主

    var a = 1
    var a =2 
    b=1
    b=2
    console.log('ab',a,b) //ab 2 2

 快捷声明

以逗号隔开可以只用一个声明命令去声明多个变量

var a =1,b=2;c=3
delete window.a
delete window.b
delete window.c
console.log('a',a) //1
console.log('b',b) //2
console.log('c',c) //c is not defined

 注意c的前面是一个分号,c实际是个隐式声明

 

作用域(变量作用域)

1.全局作用域

   一般是指一个script标签或者js文件中.声明的变量可在这个文件中任何角落使用

2.函数作用域

  声明的变量只能在当前函数中使用

   一般是指函数内部.它和全局作用域的关系基本是,函数在全局中划出来一个小空间,在这个空间中我用自己的变量,你们不能拿,而且函数没了变量也没了.硬要类别的话就像是全局作用域是一个房间,而一个个函数像是一个个盒子.盒子的空间不互相共享,但是盒子们都占了全局的空间.

    var a = 1
    function fn(){
        var b =2
        console.log('ab',a,b)  //1 2
    }
   fn()
   console.log('a',a)  //1
   console.log('b',b)  //b is not defined

 在函数中可以拿到全局变量,在函数外拿不到函数内变量.也就是说它跟你用什么方式声明没有关系,只跟你声明的位置有关.

函数作用域不能覆盖全局变量,但可以修改全局变量

覆盖(重声明)

var a = 1
function fn(){
    var b =2
    var a =2
    console.log('ab',a,b)  //2 2
}
fn()
console.log('a',a)  //1

 修改

var a = 1
function fn(){
    var b =2
    a =2
    console.log('ab',a,b)  //2 2
}
fn()
console.log('a',a)  //2

3.块级作用域

 变量提升和块级作用域

posted on 2021-09-27 17:37  Shyno  阅读(95)  评论(0编辑  收藏  举报