JavaScript之变量创建的有趣发现

近日在看面试题的时候发现了变量创建的另一种方法,即不用关键字(var、let、const)创建变量,而是直接赋值,如

1
2
a=1;
console.log(a);

开始第一眼看见这个代码认为会报错,因为a未声明,但是神奇的是并没有报错,并且a的值正常输出为1.

我开始猜想a = 1等价于this.a = 1,在上面的情况中,this指向全局对象window,所以a会作为属性加入window对象的属性里面

为了验证,我又测试了下面的代码

1
2
3
4
5
6
7
8
var obj={
f : function bar() {
a = 1;
}
};
obj.f();
console.log(obj.a); //undefined
console.log(window.a); // 1

如果正如我之前所想,即a = 1等价于this.a = 1,那么这里this指向obj,a就应该加入到obj的属性中,即obj.a应该为1。但是,结果显示obj.a为undefined, window.a为1。说明我之前的猜想是错误的。

最后,我得出的结论是
不用关键字直接赋值产生的变量(此变量未声明过)无论在什么场景下都会加入到全局对象window的属性中。