转行前端(JS篇3):带VAR和不带的区别

198 阅读1分钟

在全局作用域下声明一个变量,也相当于给window全局对象设置了一个属性变量的值就是属性值(私有作用域中声明的私有变量和window没啥关系)

console.log(a)//=>undefined

console.log(window.a)//=>undefined

console.log(‘a’ in window)//=>true 在变量提升阶段,在全局作用域中声明了一个变量A,此时就已经将A当作属性赋值给window了,只不过此时还没有给A赋值,默认值undefined。 in:检测某个属性是否隶属于这个对象

var a=12;//=>全局变量值修改,window的属性值也跟着修改

console.log(a)//=>全局变量A 12

console.log(window.a)//=>window的一个属性名A 12

window.a=14

console.log(a)//=>14

全局变量和window中的属性存在“映射机制”

a=12;

console.log(a)

----------------------------------------------------

不加var的本质是window的属性

console.log(a)//=>uncaught referenceError:a is not defined

console.log(window.a)//=>undefined

console.log('a' in window)//=>false

a=12;//window.a=12

console.log(a)//=>12

console.log(window.a)//=>12

--------------------

var a=12,

      b=13;这样写b是带var的

var a = b =12; 这样写b是不带var的

----------   ------------

console.log(a,b);//=>undefied,undefined

var a = 12,b = 12;

function fn(){

console.log(a,b);//=>a=undefined,b=12

var a = b = 13;

console.log(a,b);//=>a=13,b=13

}

fn();

console.log(a,b);//=>a=12,b=13

私有作用域中带var和不带也有区别

1、带var的在私有作用域变量提升阶段,都声明为私有变量,和外界没有任何关系

2、不带var不是私有变量,会向他的上级作用域查看,看是否为上级的变量,不是,继续向上查找,一直找到window为止(我们把这种查找机制叫做:“作用域链”)

也就是我们在私有作用域中操作的非私有变量,是一直操作别人的