您的位置:首页 > Web前端 > JavaScript

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

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

看一下代码

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 所以报错
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: