首页 新闻 会员 周边

请教一个比较奇怪的JavaScript问题

0
悬赏园豆:20 [已解决问题] 解决于 2012-02-10 09:03

代码一:

<!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

请问为什么结果不同呢?

artwl的主页 artwl | 专家六级 | 园豆:16736
提问于:2012-02-09 10:47
< >
分享
最佳答案
2

第一种情况弹出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属性。


收获园豆:10
LCM | 大侠五级 |园豆:6876 | 2012-02-09 13:56

明白了,谢谢

artwl | 园豆:16736 (专家六级) | 2012-02-10 11:01
其他回答(2)
1

两种结果当然不同了。第一种中<script type="text/javascript">
       
if (!("a"in window)) {
           
var a =1;
        }
        alert(a);
   
</script>代码是全局的加载页面的时候会执行alert(a)的时候a在这个页面就存在了是undefined的值,触发按钮的所会弹出undefined

第二种只是点击按钮的时候触发所以a之前不存在,就会执行var a =1;结果会弹出1。

收获园豆:5
sunlary | 园豆:934 (小虾三级) | 2012-02-09 11:16
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);

参考博客: http://blog.goddyzhao.me/JavaScript-Internal

收获园豆:5
ChatinCode | 园豆:2272 (老鸟四级) | 2012-02-09 14:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册