变量声明
声明方式
显式声明:用命令声明一个变量,比如(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