下面小编就为大家带来一篇 javascript 作用域、作用域链 (菜鸟必看)。小编觉得 挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
javascript 的作用域和作用域链是我学习最痛苦的一部分, 因为我花了好多时间看了好多技术文档都没有理解. 大体知道什么意思了, 然后还说不出之所以然来.
通过我大量的测试和看技术文档总结了以下理解,虽然不是很有技术范但是确实能理解了。
1、javascript 只有全局和局部之分,那些后台语言的各种修饰符都没有。在函数中不使用 var 则为全局。如下:
- <script type="text/javascript">
- varname="c#";//全局
- window.name="java";//全局
- varlanguage=function()
- {
- alert(name);
- name="javascript";//全局
- var name="JS";//局部
- alert(name);
- }()
- alert(name);
- </script>
上面代码中表示为全局的在都指向同一个变量,下面的定义会替换上面的。关于三个 alert 分别是 underfind,js,javascript. 这就是作用域起了作用了。
2、作用域链从 0 级开始依次往下排,所谓的依次往下排指的是子级的排列。在寻找变量的时候先从同级找再找父级。
在上面的例子中,
首先弹出的是 language 方法里的第一个 alert,如果 window 全局是 0,那么在例子中 var name="js" 这个就是 1. 第一个 alert 就在 1 中找,如果找不到在去 0 中找。这是它发现了同级有一个 var name="js" 但是它目前还没有赋值,所以弹出 underfind
第二个弹出是 language 方法里的第二个 alert,同样的他会在 1 里找也就是方法内部。他找到了 name 而且赋值了 js,所以弹出的是 js
第三个弹出是最下面的 alert,由于在方法内部已经给全局 name 重新赋值了,导致弹出的是 javascript。
然后增加下一个链路我们在 language 中顶一个方法,如下:
- <scripttype="text/javascript">
- varname="javascript";//全局
- window.name="javascript";//全局
- varlanguage=function()
- {
- alert(name);
- name="javascript";//全局
- varname="JS";//局部
- alert(name);
- var lovelanguage=function(){
- alert(name);
- }();
- }()
- alert(name);
- </script>
此时 lovelanguage 里的 alert 弹出的是 js 因为他会找上一级也就是 language 里的 name,所以。。。
以上就是小编为大家带来的 javascript 作用域、作用域链 (菜鸟必看) 的全部内容了,希望大家多多支持脚步之家。
来源: http://www.phperz.com/article/17/0303/264849.html