javascript的预解析与运行机制

来源:互联网 发布:matlab生成小世界网络 编辑:程序博客网 时间:2024/05/29 17:02
java的编译器的将源码编译为机器码或字节码在执行,而JavaScript是直接解析代码并运行输出
而Chrome的v8引擎比较特殊,先将源码编译为字节码,再转为机器码,执行。
预解释阶段是将源码转换为字节码
预编译阶段主要做的操作是:
var,function声明的变量提升到所在的作用域前
例如:
var a,b;(function(){    alert(a);  //undefined    alert(b);  //undefined    var a=b=3;    alert(a);  //3    alert(b);  //3})();alert(a);   //undefinedalert(b);   //3
函数内相当于
 var a; alert(a);   alert(b);  b=3;a=b;alert(a);alert(b);

对于function声明函数与函数表达式在预编译阶段的不同:
函数声明是:
function name(){...}
函数表达式:
var name = function(){...}
在预编译阶段,函数声明会提前,而函数表达式不会提前
(function(){var x=foo();var foo= function(){return "foobar";}return x;})();



输出:类型错误
var foo=function(){}声明的函数在预编译阶段不提升

同名的函数声明,后一个会覆盖前一个
var m=1,j=k=0;function add(n){return n = n+1;}y=add(m);function add(n){return n=n+3;}z=add(m);

输出4,4
原因是函数声明提升,后一个add函数覆盖前一个函数。
函数声明与函数表达式同时定义的比较:
var AA = function(){
console.log(' 1 ');
}
AA(); // 输出1

function AA(){
console.log(' 2 ');
}
AA(); //输出1
function AA会先提升,var AA=function赋值后,变量AA变成了函数,同名函数,覆盖,所以输出的都是1.

预解析分阶段进行
<script>var a=3;function AA(){a=4;console.log(a);}</script><script>function AA(){a=5;console.log(a);}</script>
输出的是4,分块解析是按<script>分块解析,没解析到下一块的时候,下一块的变量和function声明的函数不能提升。解析到下一块的时候,上一块的作用域链还存在,下一块可以使用上一块同一作用域的变量。
<script type="text/javascript">var a=5;function bb(){a=6;console.log(a);}</script><script type="text/javascript">console.log(a);</script>

输出的是5

运行过程:
js运行的时候是javascript引擎执行的,js引擎根据ECMAscript标准解析javascript代码的
但是IE的js引擎不是按照标准来的,所以产生了兼容性问题。
js执行的时候是单线程的,原因是多线程会造成同步的问题,比如,多个线程同一时间操作DOM,那浏览器就不知道以哪一个为准。
单线程意味着,按顺序执行代码,但是这样容易造成堵塞。于是将任务分成两种形式,同步任务和异步任务。
所有的同步任务在主线程上执行,形成执行栈。
先将异步任务挂起,异步任务有了运行结果就在任务队列放置一个事件,等同步执行完,就读取任务队列。
使用异步的模式编程的由:回调函数,事件,promises对象。
例如:
console.log("1");
setTimeout(function(){
console.log("2");
},10);
console.log("3");

原创粉丝点击