JavaScript-javascript 判断变量是否存在问题?

JavaScript-javascript 判断变量是否存在问题?

瑾兮 发布于 2017-07-27 字数 142 浏览 1081 回复 1

js代码如下:

if(!("num" in window)) {
var num = 123;
}

alert(num); //undefined

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

灵芸 2017-10-29 1 楼

//代码:

 if(!("num" in window)) {
var num = 123;
}
alert(num);

这个为什么会是undefined呢?因为 !("num" in window) 返回的是false,if语句里面的代码根本就不执行,所以alert(num)当然会是undefined了。

你可能会觉得很奇怪,为什么在if之前都没有声明num变量,可是为什么会("num" in window)会是true呢,又不得不讲JavaScript运行机制了,首先先来看看两段代码
//代码1:

 alert("num" in window); //返回false
if(!("num" in window)) {
num = 123;
}
alert(num); //输出:123

//代码2:

 alert("num" in window); //返回true
if(!("num" in window)) {
var num = 123;
}
alert(num); //输出:undefined

两段代码就差num变量前的var声明,为什么会这样呢?

JavaScript的运行机制是:
JavaScript引擎在初始化时,会先扫描作用域中的所有变量,并将所有var声明的变量注册到全局对象window上,并为这些变量的赋初值为undefined。而当运行代码时,会优先访问局部变量,如果没有这个局部变量就访问上一层的局部变量(如为闭包,上一层为闭包创建环境),直到访问到完全局变量。如果都没有这个变量,那么抛出异常。

由此可见,var并非只是声明全局和局部变量那么简单,所以以上两段代码1和代码2相差一个var,那么就会去扫描var声明的num并将其注册到window对象中,所以当代码运行时,"num" in window就会返回true