var x = 1;test();function test(){    console.log(x) //1}function test(){    console.log(x) //undefined    var x = 10;}function test(){    console.log(x) //1    x = 10;    console.log(x) //10}

大前提:Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定变量的作用域

第一种test写法  X先在外层被声明了全局作用域 执行到test的时候 X作用域没有变 直接打印全局x

第二种test写法  X先在外层被声明了全局作用域 执行到test时候 x作用域被声明为局部作用域 而此时局部作用域的x并没有赋值  赋值是在console之后才发生的

第三种test写法  X先在外层被声明了全局作用域 执行到test的时候 X没有被声明为局部作用域  所以x仍然为全局作用域 故第一个可以打印出1


可以这样理解 在执行方法的时候 第一步执行的是变量的声明  然后才是后面的逻辑代码

var x = 1function test(){    alert('ok')    console.log('ok')    var x = 100}function test(){    var x;    alert('ok')    console.log('ok')    x=100;}

上面第二种test就是第一种test在JS解析时候的执行过程 执行到test方法时 先把声明变量的部分挪到前面 确定变量的作用域; 赋值的地方不变; 第二种test x=100 此时的X只是局部赋值


函数内容的var是局部赋值 不带var的直接赋值是全局的

function test(){    x= 1}console.log(x)//undefinedtest();console.log(x)//1