码迷,mamicode.com
首页 > Web开发 > 详细

第06课:作用域、JS预解析机制

时间:2015-06-02 19:38:38      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

从字面上理解----域就是空间、范围、区域,作用就是读、写,所以作用域我们可以简单理解为:在什么样空间或者范围内对数据进行什么样的读或写操作。

 看一下代码

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 所以报错

 

 

 




 

第06课:作用域、JS预解析机制

标签:

原文地址:http://www.cnblogs.com/eveblog/p/4547035.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!