首页 > 变量只声明会被覆盖掉吗

变量只声明会被覆盖掉吗

var a = 10;

function test () {
    a = 100;
    console.log(a);      //100
    console.log(this.a); //10
    var a;
    console.log(a);      //为什么这个最后也是输出10了,讲道理的话应该是undefined,就算被覆盖难道不是被100 覆盖吗
}
test();

楼主的代码粘的有点乱,我第一次看错了...

先上百科:
过程体(包括方法function,对象Object o ={})外的所有变量不管你有没有加var保留字,他都是全局变量
而在过程体内(包括方法function(){},对象Object o={})内的对象加var保留字则为局部变量,而不加var保留字即为全局变量

第一行的var a = 10; 是全局变量
调用test函数的上下文环境即Window
console.log(this); //Window
在函数内部,由于变量提升,var a;这行相当于在最前面,所以函数内部的a是局部变量.

就是说楼主的代码中,有一个全局变量a和一个局部变量a;
全局变量a = 10;
局部变量a = 100;


var a = 10;

function test () {
    a = 100;
    console.log(a);      //100
    console.log(this.a); //10
    var a;
    console.log(a);      //为什么这个最后也是输出10了,讲道理的话应该是undefined,就算被覆盖难道不是被100 覆盖吗
}
test();
VM9973:6 100
VM9973:7 10
VM9973:9 100

楼主提问题之前不运行一下函数吗?最后一个明明打印出100的,这样容易给人误解的,自己都没研究过?


var a那句让a变成了局部变量,你的最后那个console.log(a)返回的应该是100才对,你是不是看错了。。。囧


变量提升所致,相当于如下代码

function test() {
    var a = 100;
    console.log(a);
    console.log(this.a);
    console.log(a);
}

楼主提问题之前不运行一下函数吗?最后一个明明打印出100的,这样容易给人误解的,自己都没研究过?

【热门文章】
【热门文章】