六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 34|回复: 0

JavaScript的作用域(学习笔记三)

[复制链接]

升级  25.33%

24

主题

24

主题

24

主题

秀才

Rank: 2

积分
88
 楼主| 发表于 2013-1-22 22:39:33 | 显示全部楼层 |阅读模式
还是先上一段代码,思考一下执行的结果。
 
<script>var str = 'outer';function test1(){alert(str);};function test2(){alert(str);var str = 'inner';};function test3(){var str = 'inner';alert(str);};function test4(){alert(strInfo);};test1();test2();test3();test4();</script>  有了前面关于作用域的相关知识,这里的问题应该很容易回答了。
 分别打印出:
 

  •  outer
  •  undefined
  •  inner
  • js脚本错误:strInfo未定义。
test1很简单,使用了全局变量str,所以,肯定打印出全局变量对应的值:outer。
test3很简单,函数中重新定义了str,所以打印出局部变量对应的值:inner。
test4很简单,从来没有定义过strInfo,直接引用的话,会报js脚本错误。
重点说一下test2。很多人认为,test2按道理,就比test1多了一行,应该打印出outer,然后,对str重新赋值。如果你也这样想,就错了。说明,对变量的作用域还不是很了解。
 
上面的代码,一共是4个作用域:全局作用域、test1的作用域、test2的作用域和test3的作用域。test2中的代码其实是下面这样的
 
function test2(){        var str;alert(str);str = 'inner';}; 这样一看,大家应该明白了吧。在定义test2的时候,编译器会查找在这个作用域中是否有var关键字,如果有,则在作用域的最顶端事先声明;如果没有,就会到test2的上一层作用域中进行查找,如果找到了,就显示相应的数值(这其实就是test1的情况),如果没有就再向上一层找,知道全局作用域。如果全局作用域也没有,就会报脚本错误(这其实就是test4的情况)。
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表