大家都知道,在他所属的定义域类,会存在一个变量提前,就是声明这个变量的消息,会被提到本作用于最前面,于是乎就有了下面这种题目;
var c=2;
function fn(){
console.log(a);
var a=1;
console.log(a);
var c=1;
}
console.log(c);
fn();
输出的结果当然是,2,undefined,1;
为什么呢?
首先再fn这个房间内,变量a和c一旦被声明,那就如同放了两个写有a和c的气球上去,他会漂浮到自己这个房间的顶层,赋值好比是给这个气球再写上值,console.log来的比a赋值为1时早,所以第二个console.log结果是2,读到后面a才被赋值为1,于是乎最后一个console.log就为1;
这里可以用声明的变量提前来解释,还有代码是从上到下读的
那第一个console.log(c) 为什么不是1呢?不是一开始赋值为2,后面又对他重新赋值了么?其实因为fn里面的哪个 c,外面的想拿到函数内的一些变量,除非你return出来,或者用闭包提供,是拿不到的,这里就是定义域的作用,函数fn就好像一个城堡,隔离了内部的变量,所以第一个console.log(c)其实就是找的同一作用域的c,就是第一行代码。
想想,要不明天回忆一下 简单数据类型 和 引用数据类型 吧,晚安···
网友评论