JS预解析

1.在逐行读js代码前,解析器会先提取所有声明的var变量和函数

js解析器会先把脚本里所有var变量声明读一遍,但是它只读变量名字,不读变量值,一开始它会赋给所有读到的var变量一个【未定义】的值。而js解析器提取函数是整块提取的读出来,把函数当作整体来看待,也就是说读变量是没值的,读函数是有内容的。这个过程就是js的预解析

所以在逐行读代码的这一步时,解析器每找到一个var声明,就会去看先前提取的东西中有没有它的值(往往是【未定义】)

2.var a=0;

var是声明, a=0是表达式

如果你只写了a=0时,预解析就不会提取a,那么当后面你要用到a时,解析器去仓库中没有找到a,就会报错,而不是告诉你“a的值是未定义”;

 

3.预解析时有一条重要原则,当函数命名冲突了(重名),解析器会【“留下函数,丢掉变量,无关函数声明和变量声明的顺序”】,也就是哪怕先声明的函数a,后声明的变量a,预解析仓库中存的a的值也是函数值而非 未定义(变量的值)。

 

4.【表达式】  

    带有= + - * /  这样“可以改变值的符号的”才叫表达式,一个单纯函数的声明是不会改变任何值的(没有表达式),所以看下面例子

在这个图中,当解析器执行到第二部“逐行读代码”时,第39行的声明并没有改变预解析仓库中的值,因为它不是表达式。

 

5.作用域上的问题

  (1) 局部变量可以拿到全局变量的值,但是全局变量没法拿到局部变量的值,比如你可以在函数内给一个变量赋全局变量的值,但是你不能在函数外给一个全局变量赋一个函数内声明的变量的值;

  所以我们要全局变量能拿到局部变量的值的方法就是,先声明一个全局变量,然后【在函数内】,把某个局部变量的值赋给它,就拿到了

(2)  函数内部形成了一个作用域,但是同样具有大括号的if语句和for语句,它们的大括号内并不形成作用域,在其中声明变量仍然是全局的

 

6.一个一直没有注意到的问题

for(i=0;i<3;i++){alert(i)};  //会弹出0,1,2  没有问题        但是这时的i=3    而不是i=2

猜测原因,当弹出0这个动作完了之后,i就变成了1。(i++是先执行后增加的),当弹出2后,i就变成了3。    它执行了三遍, ++了三遍,怎么可能i不达到3    只是因为没显示出来而已;

未完待续

posted @ 2015-07-09 18:06  刺蛇笑眯眯  阅读(246)  评论(0编辑  收藏  举报