一、JavaScript是怎么运行的?
JavaScript会先扫描一遍所有的js代码,江湖人称 ---预处理。
然后在进行内部已经定好的优先级进行运行 ---执行阶段 。这是每个JavaScript初学者必须要懂的
二、JavaScript运行顺序的重要性?
了解一门语言的执行顺序,才能深入理解语法的由来,才能了解到某些语法的原理。
对比 用var 关键词声明的变量和不用var 关键词声明的变量的优先级。
<script type="text/javascript">
alert(a);//报错
a=1;
</script>
没有用var关键词声明的变量,在预处理阶段不会被读取,属于执行阶段的产物。
<script type="text/javascript">
alert(a);//undefined
a=1;
var a;
</script>
用了var关键词声明的变量,在预处理阶段就被置顶,优先级很明显高于没有被var关键词声明的变量。
对比用var关键词声明的变量和用function关键词声明的变量的优先级。
<script type="text/javascript">
alert(a);//function(){}
a=1;
var a=3;
function a(){}
alert(a);//3
</script>
用了var关键词和function关键词在处理的时候会被置顶,但function的优先级高于var关键词的优先级。会被置到最顶部。
根据已经确定好的执行顺序执行,大家可能会有疑惑var 关键字的a为什么不会覆盖 function的a,预处理的时候function声明
a的存在导致直接忽略掉了 var a 的存在,第一次打印就是function本身,赋值属于执行阶段,从上往下看 a=1就被a=3 覆盖
掉了。所以是a=3.
再来看一个例子
<script type="text/javascript">
var a;
function a(){}
alert(a);//function(){}
</script>
<script type="text/javascript">
var a=3;
function a(){}
alert(a);//3
</script>
大家很容易产生误区,在深入理解执行顺序后,其实是一个道理。第一个例子 var a至始至终都是被忽略的,内部顺序
始终没有function高,无论怎么用这个a 都是function的a。 第二个例子 我们把预处
理和执行阶段看做一个整体,看做上下文。a被赋值了处于下文,就不可能被function忽略掉。function优先级高于var,在var
的上方,被后面的var a 覆盖掉了。也很好的说明的function的优先级高于var 。
我为大家画个图方便大家理解
函数内部执行arguments会优先于function 因为属于外部传进函数,别的原理一样。
详解可以看我的博客预处理和函数预处理。