1. 在最外面使用
直接使用未被声明的变量会报错
console.log(aa);
上面代码会报:
Uncaught ReferenceError: aa is not defined
所以正常情况下,我们需要声明一下才能使用
var aa;
console.log(aa);//输出undefind
这样就不会报错了。
js会对var的声明进行前置
可以利用js对var声明可以前置的特性,以下写法也是可以的:
console.log(aa);
var aa = {};
以上代码会输出
undefined
实际上内部是这样执行的
var aa;
console.log(aa);//因为前面只进行了var声明,前未进行赋值,所以还是输出undefind,
aa = {}
这里并不是把var声明移到了console输出上面一行,而且移到了js代码块的最顶部,如果有多个var声明,会把这些声明都移到顶部。
js对未使用var的赋值不进行前置
console.log(aa);
aa = {};
上面代码还是会报错: Uncaught ReferenceError: aa is not
defined,因为js只对var的声明进行前置。
不管var在什么地方,都会进行前置
console.log(aa);//输出undefind
if (false) {
var aa = {};
}
虽然var写在了if里,并且条件为假,但是js还是会把这进行提前,最后输出undefind,不会报错。
2.在函数里使用
var a= 100;
(function f() {
console.log(a);
if (0) {
var a=200;
}
console.log(a);
})();
上面代码会输出两个undefined,因为函数内声明了一个局部变量a,虽然if条件为假,并且在第一个console.log后面定义的,照样不会报错,这叫声明提前,它等效于在f函数内第一行就先声明一个var
a; 实际示是代码这样执行的:
var a= 100;
(function f() {
var a;
console.log(a);//前面只声明,未定义,所以输出undefind
if (0) {
a=200;
}
console.log(a);//if (0)为假,a=200并被执行,所以还是输出undefind
})();
总结:在函数里使用和在最外面使用是一样的:
-在函数里使用时,会把var声明前置到函数顶部,就算类似if (0) var aa=[];这样写也会被提前,对不使用var的赋值不会提前,
-在最外使用时,会把var声明前置到js块顶部,就算类似if (0) var aa=[];这样写也会被提前,对不使用var的赋值不会提前,