JS变量的声明

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 = 1


function 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)//undefined
test();
console.log(x)//1


猜你喜欢

转载自blog.51cto.com/6292848/2381317