js中变量声明与变量提前
变量声明:通过var表明变量的类型与名字,但并未赋值,如 var a;
变量初始化:即为a赋值,如 a=1;
使用变量步骤:a.声明–>b.赋值–>3.调用
使用方法
// 方式一:声明和赋值不分离
var str = "声明和赋值不分离";
console.log(str); //结果:声明和赋值不分离
// 方式二:声明和赋值分离
var str2;
str2 = "声明和赋值分离";
console.log(str2); //结果:声明和赋值分离
注意:在同一作用域中,变量的名字只能使用一次(不能重复声明同一个变量),但可以为同一个变量赋值,后面赋的值会覆盖前面的,如;
//变量声明并初始化
var num = 1;
console.log(num); //结果:1
// 同一变量重新赋值,后面的值会覆盖前面的
num = 3;
console.log(num); //结果:3
变量声明提前
变量声明提前,仅仅是将声明提前了,但未赋值,举个例子:
console.log(a);
var a=1;
输出的结果是undefined,原因是变量声明提前,可以将代码理解为:
var a;//只声明了变量未赋值
console.log(a);//结果为undefined;
a=1;
再来看个例子
var a=1;
console.log(a);//结果为1
function b(){
console.log(a);//结果为undefined;
var a=2;
console.log(a);//结果为2;
}
b();
为什么第二个a的结果是undefined?原因也是变量声明提前,代码相当于:
var a=1;
console.log(a);//结果为1
function b(){
var a;
console.log(a);//结果为undefined;
a=2;
console.log(a);//结果为2;
}
b();
但如果将var a=2删掉,console.log(a)会从函数内部往上一层层找,输出的结果就是1,此时的a是全局变量;
再来看一个例子:
var a=1;
function b(){
a=10;
return;
}
b();
console.log(a);//结果为10;
///////////////////////////
var a=1;
function b(){
a=10;
return;
function a(){}
}
b();
console.log(a);//结果为1
第一个代码结果为10很好理解,但第二个为什么是1呢?因为里面写了个function a函数声明会提前,相当于在局部又声明了一个a就影响不到全局的a;看代码:
var a=1;
function b(){
var a=function (){};
a=10;
return;
}
b();
console.log(a);
函数外面的a访问不到在函数中声明的变量,这就是闭包;