很多时候我们会发现,使用一个变量即使不带var关键字声明,也并不会报错,如
function fn1() {
i = 1;
console.log(i);
}
fn1()
//输出1
function fn2(){
var i = 1;
console.log(i);
}
fn2()
//输出1
当执行这两者时二者都会同时输出‘1’,这使的我们觉得这二者并没有什么不同,但一些书籍则会说明这两者并非完全相同。那到底不同在哪?
console.log(x);
x = 0;
console.log(y);
var y = 0;
上述结果将会直接报错,事实上当我们声明x=0时,我们是将其声明为global object的属性,在BOM中可以通过window来访问,而当处在globalContext时,则有(global === globalContext(VO)),所以也就是说这两者并不是一样的。
再回到上面的例子中,在进入globalContext时,其属性(property)VO中,只有y存在,且为undefined。而在代码执行阶段,console.log(x)并没能找到变量x,所以将会报错,程序中断。
所以如果此时我们希望能够不报错,我们可以这样改
x = 0;
console.log(x);
console.log(y);
var y = 0;
此时程序将会输出0以及undefined,因为在代码执行阶段,global的属性(property)x将被创建,并赋值为0,所以x能够被找到,程序正常打印,而由于代码执行阶段,打印y在给y赋值之前,所以将会打印undefined。
网友评论