关于带var和不带var声明变量

2019-07-23  本文已影响0人  YucinChow

很多时候我们会发现,使用一个变量即使不带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。

上一篇 下一篇

猜你喜欢

热点阅读