代码一:
<!DOCTYPE html>
<html>
<head>
<title>Demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script type="text/javascript">
function test(){
if (!("a"in window)) {
var a =1;
}
alert(a);
}
</script>
</head>
<body>
<script type="text/javascript">
if (!("a"in window)) {
var a =1;
}
alert(a);
</script>
<input type="button" onclick="test()" value="test"/>
</body>
</html>
运行后弹出 undefined ,点击按钮后弹出 undefined
代码二:
<!DOCTYPE html>
<html>
<head>
<title>Demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script type="text/javascript">
function test(){
if (!("a"in window)) {
var a =1;
}
alert(a);
}
</script>
</head>
<body>
<input type="button" onclick="test()" value="test"/>
</body>
</html>
点击按钮后弹出 1
以上测试环境 FireFox10.0,Chrome 17.0.963.26 beta-m,IE7/8/9
请问为什么结果不同呢?
第一种情况弹出undefined,肯定是因为("a" in window)==true,没执行a=1这个赋值的语句
第二种情况弹出1,肯定是因为("a" in window)==false,执行了a=1这个赋值的语句
"a" in window 表示的是说window这个对象中是否含有a这个属性。
第一种情况和第二种情况的不同,主要是因为变量的作用域不同,第一种情况不仅定义了函数内的属性a,还定义了全局的属性a,所以("a" in window)==true,第二种情况就只在test方法中定义了函数内的a属性。
明白了,谢谢
两种结果当然不同了。第一种中<script type="text/javascript">
if (!("a"in window)) {
var a =1;
}
alert(a);
</script>代码是全局的加载页面的时候会执行alert(a)的时候a在这个页面就存在了是undefined的值,触发按钮的所会弹出undefined
第二种只是点击按钮的时候触发所以a之前不存在,就会执行var a =1;结果会弹出1。
(1)javascript 没有块级别的作用域;(2)全局(global)变量是宿主对象(浏览器里面是window)的一个属性。
1 //代码片段可以改写为,
2 function test(){
3 var a; //a 是局部变量, var a 可以放在函数内任何地方
4 if (!("a" in window)) {
5 a =1;
6 }
7 alert(a);
8 }
9
10 var a; //a是全局变量 所以在window中, 同样var a 可以放在函数外的任何地方
11 if (!("a" in window)) {
12 a =1;
13 }
14 alert(a);