变量、作用域和内存问题
全局变量:全局变量定义可以提供给所有代码块和函数调用
if(true){
var c=33
}console.log(c)//33 可以访问到
私有变量:在js下,只有函数里定义的变量才是私有的
var a=11
function fun(){
var b=12
console.log(a)//11
console.log(b)//12
}
fun()
console.log(a)//11
console.log(b)//报错,调用不到,b是私有变量
基本数据类型:null undefined number string boolean
引用数据类型:object
变量提升和作用域
预解释(变量提升)
在当前的作用域中,js代码执行之前,浏览器首先会把带var和function的声明内容,进行提前声明或定义
声明和定义区别
var a //声明:告知浏览器在内存中存储一个变量
var b=11//定义:不但定义了变量,还进行了赋值
变量提升的函数和变量的区别
var在内存中只完成了声明
function在内存中完成了声明和定义,只是函数没调用时存储的是字符串
例如:
Console.log(a)//输出undefined
Var a=11
fun()//执行函数
function fun(){
Console.log(“这是函数”)
}
变量提升注意事项
1、不定义var 的区别
console.log(a)//undefined
console.log(b)//报错,没有变量提升的过程
var a=11
b=22
2、不管条件是否成立,都要进行变量提升
console.log(a)//输出undefined变量还存在
if(false){
var a=12
}
- 当执行一个匿名函数的时候,是不进行预解释的,代码的执行和定义一起完成了
(function(){
var a=b=3 //var b=3 a=b
})()
console.log(b)//3 先声明了b b变量提升了
console.log(a)//报错 a没有域解释 a没有变量提升
- 当函数里的return语句执行时,下面的语句虽然不执行,但也需要变量提升
注意:函数作用域下,有私有变量找私有变量,没有找形参,形参没有,找全局,如果形参和私有变量进行了变量提升,就不会找全局变量了,输出undefined
function fun(){
console.log(a)
return false
var a=66
}
fun()
- 在js中,变量和函数名称重复了,也会冲突,在变量提升时,如果名称声明过了,不会再次声明,但是可以重新赋值
function num(){
console.log(111)
}
num()
var num=66
console.log(num)//输出:66;var不会重新声明,但是可以改变值
num()//报错