恩,预编译的问题。放外面的时候var t = 'a';t就不是undefined了。放里面的时候执行到if的时候t还是undefined,而undefined算是一个特殊的数据类型,window下是可以直接访问的,所以undefined in window就是ture了。两段代码预编译后是这个样子的:function test(){ var t = "a"//此时t='a' var a ; if(t in window){ a = 1; } alert(a); } //弹出undefined function test(){ var t; var a; if(t in window){ t = "a"; a = 1; } alert(a); } //弹出1 简单的说你试一下undefined in window就知道了
2楼请问下,你说那个window里面到底有什么?或者 xx in window 为真,这个xx都是什么的情况下为真?
window就是浏览器对象啊,里面有document,location什么的。这些写window.document跟document效果是一样的。你举得例子里,下面的时候t是undefined,这个也是在window里,所以t in window就等同于undefined in window 所以是true。#2说的块级作用域就是比如说在if代码块之内的作用域,这个在JS里面是没有的。所有变量的作用域都是向上查找离他最近的那个function,在这整个function里面都是可以访问他的,就算你在这个function的最末尾写上var t,但没给他赋值,你在function的第一行也是可以直接访问t,只是这个时候t的值是undefined。具体的window里面到底有什么,这个说起来就比较多了,BOM对象你自己去百度一下吧。
<script type="text/javascript"> var o={name:"lizc"}; alert("name" in o);//结果为true;in语法用于判段in前面的字符串是否为in后面的对//象的属性。 </script>
直接 for(x in window){ console.log(x+":"+window[x]) }; 看看window里面包含不含自定义的变量就清楚了
var t = "a"//此时t='a'
var a ;
if(t in window){
a = 1;
}
alert(a);
}
//弹出undefined
function test(){
var t;
var a;
if(t in window){
t = "a";
a = 1;
}
alert(a);
}
//弹出1
简单的说你试一下undefined in window就知道了
window就是浏览器对象啊,里面有document,location什么的。这些写window.document跟document效果是一样的。你举得例子里,下面的时候t是undefined,这个也是在window里,所以t in window就等同于undefined in window 所以是true。#2说的块级作用域就是比如说在if代码块之内的作用域,这个在JS里面是没有的。所有变量的作用域都是向上查找离他最近的那个function,在这整个function里面都是可以访问他的,就算你在这个function的最末尾写上var t,但没给他赋值,你在function的第一行也是可以直接访问t,只是这个时候t的值是undefined。具体的window里面到底有什么,这个说起来就比较多了,BOM对象你自己去百度一下吧。
var o={name:"lizc"};
alert("name" in o);//结果为true;in语法用于判段in前面的字符串是否为in后面的对//象的属性。
</script>
for(x in window){
console.log(x+":"+window[x])
};
看看window里面包含不含自定义的变量就清楚了