Javascript基础知识

var a = 1;

function foo() {
    if (!a) {
        var a = 2;
    }
    alert(a);
};

foo(); //2

解释器分析代码为:

var a;
a = 1;

function foo() {
    var a;     
    if (!a) {
        a = 2;
    }
    alert(a);     // 此时的 a 并非函数体外的那个全局变量
}

a=2;并不等价于

var a;
a=2;

为什么foo()函数里会有一个 var a;

阅读 2.3k
3 个回答

变量声明提升(变量赋值并不会提升)
用var声明变量不管是在哪里都相当于在顶部(函数内有局部作用域所以在函数内var相当于在函数的第一行声明)

alert(a)//undefined
function x(){
    alert(a)//undefined
    var a = 5;
     alert(a)//5
    function y(){
        alert(a)//undefined
        var a = 7;
        alert(a)//7
    }
}
var a = 1;
alert(a)//1

都等价于

var a,b;
alert(a)//undefined
function x(){
    var a,b;
    alert(a)//undefined
    a = 5;
    alert(a)//5
    function y(){
        var a;
        alert(a)//undefined
        a = 7;
        alert(a)//7
    }
}
a = 1;
alert(a)//1

js只有在函数内才有局部作用域
所以在函数内任何地方声明都是相当于在第一行声明
函数内是一个独立的作用域 函数内的变量会先在局部内找(函数内) 函数内没有才会继续向外找


//此函数可以在局部找到声明提前的a
function foo(){
    var a,b,c;
    if(!a){//a声明但为被定义 所以为undefined,!undefined为true通过if对a赋值 并弹出a
        a = 2;
    }
    
    var b = 1;
    alert(a)
}

关于作用域

var a =1;//这是在widow的作用域也就是全局内声明

function foo(){
    var a = 2;//这是在函数内声明
    alert(a)//因为寻找变量是从内向外找这里直接在内部就有a所以不用继续向外找
}
alert(a)//因为寻找变量是从内向外找这已经是最外层所以输出1 
//在外部是获取不到局部内的变量的除非用闭包

我谈下我的理解,函数的变量作用域是函数级的,
`if (!a) {

 var a = 2;;

}`
这一块不管 !a 取到的 布尔值 是否为真,程序都会找到 var 声明的 a,进行变量提升,也就是 var a;因为 a 声明了,未赋值,因此是 undefined,取反刚好是 true,然后 a 重新赋值为 2 ,所以打印出来的就是 2

函数在执行前会预解析,var的变量会提到函数内顶部

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题