通俗易懂JavaScript作用域(一)
来源:互联网 发布:自学软件测试 编辑:程序博客网 时间:2024/06/07 01:58
记得第一次接触JS的时候,就被JS中的作用域搞得晕头转向,估计初学者也会遇到这个问题,对JS中的作用链了解的不是很深刻。今天小编就带大家来揭开这层神秘的面纱。
初来乍到
在网上找这方面材料的时候,碰到一个人在面试的时候关于JS的试题,如下:
<span style="font-family:SimSun;font-size:18px;"><script> alert(a); var a = 1; alert(a); function a() { alert(2); } alert(a); var a = 3; alert(a); function a() { alert(4); } alert(a); a(); </script></span>
我了个去,这都什么玩意啊,看着就蒙了,下面小编带大家来慢慢的分析。
什么是作用域?
只要学习过编程语言的同志们,肯定知道局部和全局变量,其实这就是所谓的作用域。简单的理解,在什么样的空间和范围可以对变量进行操作。比如你们家的钱,我就访问不到。
JS解析器
在每个浏览器中都有一个JS解析器,用来解析JS代码,那么又是如何解析的呢?(语法、词法、语义等这些就不说了)
1.找点玩意
首先浏览器根据JS代码从中找一些东西,比如var function参数等。并且找到的东西都只是一个定义,并未读到其中的值。所有找到的var变量,在正式运行代码之前都是提前赋值为未定义的,函数在正式运行代码之前都是函数块的形式存在。找到这些东西后都放到一个仓库里面来管理。
2.分析代码
说到这里我们来分析一下上述的代码。
从上向下依次执行,找到了一下东西。
可是我们发现这些东东都叫a,这恐怕不行吧,如果都放到仓库的话,会傻傻分不清楚的,那该如何是好呢?
PK吧!谁厉害就把谁留下。PK等级为var a—函数块,并且函数块之间是后来者居上。所以经过PK后剩下什么东东呢?
所以经过PK后就剩下最后一个a的函数块了,就把他放到仓库里面了。
3.逐行解读代码
上述的过程称为JS的解析,经过解析后就开始逐行读代码了,所以这时候在看的话,就容易理解了。结果如下:
<span style="font-family:SimSun;font-size:18px;"><script> alert(a);// function a (){ alert(4); } var a = 1; alert(a);// 1 function a() { alert(2); } alert(a);// 1 var a = 3; alert(a);// 3 function a() { alert(4); } alert(a);// 3 a(); //报错 </script></span>
未完待续
- 通俗易懂JavaScript作用域(一)
- 通俗易懂JavaScript作用域(二)
- 通俗易懂JavaScript作用域(三)
- JavaScript作用域(一)
- JavaScript学习之作用域(一)
- JavaScript中的作用域和作用域链(一)
- javascript的执行环境及作用域(一)
- JavaScript特性一:变量作用域
- 通俗易懂解释java反射机制(一)
- 通俗易懂解释java反射机制(一)
- 通俗易懂看RB-tree(一)
- 通俗易懂解释java反射机制(一)
- 序列化与反序列化中serialVersionUID的作用(通俗易懂)
- 变量作用域(JavaScript)
- JavaScript作用域(二)
- Javascript闭包(狗血剧情,通俗易懂)
- javascript闭包详解(绝对通俗易懂哦)
- JavaScript中的作用域(链)和闭包(一)
- linux 调度优先级整理
- 如何使用putty连接Ubuntu系统
- java学习day24
- Ubuntu12.10 内核源码外编译 linux模块--编译驱动模块的基本方法
- XML之SAX解析模型
- 通俗易懂JavaScript作用域(一)
- 因特尔Edison学习第1站--Edison环境搭建
- 异常:org.apache.neethi.Constants.isPolicyElement()
- EL表达式
- 横屏切换竖屏Activity的生命周期
- ThreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别
- java.lang.RuntimeException: Invalid action class configuration that references an unknown class nam
- vs2008上进行托管代码与X64非托管代码调试问题
- 开始捡起编程项目