从字面上理解----域就是空间、范围、区域,作用就是读、写,所以作用域我们可以简单理解为:在什么样空间或者范围内对数据进行什么样的读或写操作。
看一下代码
alert(a); // 为什么是undefined var a = 1; alert(a); //为什么浏览器无反应 a = 1;
要了解为什么这些现象必须先知道浏览器是如何读取js代码,而这段浏览器专门用来读取js代码的片段我们称之为-----js解析器
首先,我们来理解“JS解析器”是如何工作的?
先看如下代码
alert(a); // function a (){ alert(4); } var a = 1; alert(a); // 1 function fn1(){ alert(2); }
当“JS解析器”识别到 <script> 它就开始工作了,至少从两个部分开始
1)先找一些东西 :根据 var function 参数 先找齐了再开始工作。于是先找到a,但是不会读取a等号后面的东西,所以a是未定义,
可以简单理解为 -----所有的变量,在正式运行代码之前,都提前赋了一个值:未定义 a=.......
然后根据 function 找到 fn1 = function fn1(){ alert(2); }
所有的函数,在正式运行代码之前,都是整个函数块
整体简单理解为:有变量未定义,由函数整个函数整体
这一步称之为----------‘js的预解析’
原则:遇到重名的------1、只留一个2、变量和函数重名了,就只留下函数
2)逐行读代码 :
表达式:= + - * / % ++ -- ! 参数……
表达式可以修改预解析的值!
如最上面代码当读取到
alert(a);
先去第一步仓库中找到a未定义
于是alert是undefined
接着才会执行 var a=1;此时a的值才是1
第二段里面没有var function 参数 所以仓库里面没有东西所以浏览器毫无反应
案例一:分析如下代码
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 () // 报错 Uncaught TypeError: number is not a function
分析过程
1)预解析 var function 参数
遇到重名的------1、只留一个2、变量和函数重名了,就只留下函数
最后留下function a (){ alert(4); } 整个集合
2)逐行读代码 所以第一行alert(a); 是集合 function a (){ alert(4); }
接着给据:表达式可以修改预解析的值!
遇到第二行var a = 1; 于是第三行alert(a); 的值是1
第四行无作用不执行
于是第五行alert(a); 还是1
遇到第六行var a = 3; 于是第七行alert(a); 的值是3
第八行无作用不执行
于是第九行alert(a); 还是3
第十行a(); 因为此时仓库中只有a=3,而此时在仓库中没有function 所以报错