一、变量提升
JavaScript中,var声明的变量可以在使用后再声明,因为函数及变量的声明都将被提升到函数的最顶部。
x = 2; console.log(x); //输出:2 var x;
变量的声明会提升到顶部,而初始化工作则保留在原处。
如果上面代码改成这样,则值是undefined。
备注:undefined 表示一个未声明的变量,或已声明但没有赋值的变量,或一个并不存在的对象属性。
console.log(x); //undefined var x = 2;
二、作用域
作用域是可访问变量、对象、函数的集合。
JavaScript的作用域不是以花括号包围的块级作用域,而是由函数决定。
if(true){ var x = 1; } console.log(x); //输出:1
变量在函数内声明,变量为局部作用域。
局部变量:只能在函数内部访问。
下面这样会报错。
function test(){ var x = 1;//局部变量 } console.log(x); //报错
全局变量:变量在函数外定义,在所有地方都可使用。
还有一种特殊情况,如果变量在函数内没有声明(没有使用var),即为全局变量。
如果是在函数外调用某个函数内的全局变量,则需要先调用这个函数,否则会报错。
var y = 2;//全局变量 function test(){ x = 1;//全局变量 } test(); //这里需要先调用test,否则下面x会报错 console.log(x); //输出:1 console.log(y); //输出:2
在一个函数中引用一个变量时,会先搜索当前函数作用域(局部作用域),没有找到则搜索其上层作用域,一直到全局作用域。
var x = 2; function test(){ var x = 1; console.log(x); //输出:1 } test();
var x = 2; function test(){ console.log(x); //输出:2 } test();
var x = 2; function test(){ //值:undefined //因为先搜索test的作用域找到x变量,所以上层作用域定义的x被屏蔽,但执行到console.log时x还没初始化 console.log(x); var x = 1; } test();