javascript的运行机制
2016-11-24 10:03
169 查看
在了解js的运行机制之前,我们先来了解几个重要的术语。
![](https://img-blog.csdn.net/20161124100123617)
![](http://upload-images.jianshu.io/upload_images/1925161-1f6be976606810bf.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
js是按照代码块来进行编译和执行的,代码块之间相互独立,变量和方法可以共享。
![](http://upload-images.jianshu.io/upload_images/1925161-420a61060462d2db.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
代码块的编译是按照由上之下的顺序来进行编译和执行。如果var test = “我是代码块一变量”;放在 alert(str);后面,代码块运行的时候因为前面已经出错不会运行到这个位置。
![](http://upload-images.jianshu.io/upload_images/1925161-6e7ffe7c9f576ff4.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
声明式函数与赋值式函数的区别在于:在JS的预编译期,声明式函数将会先被提取出来,然后才按顺序执行js代码。
![](http://upload-images.jianshu.io/upload_images/1925161-17a20575125661bc.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
function Fn(){}已经被预编译,所有 Fn(); 无论写在其前还是其后都会运行。相当于 function Fn(){}已经被预先放置到一个容器里面,函数运行时可以直接从这个容器中提取。
这里要注意的是同名函数后者会覆盖前者。
![](http://upload-images.jianshu.io/upload_images/1925161-baeee7561a449ca5.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
同名函数会覆盖前面的函数。
![](http://upload-images.jianshu.io/upload_images/1925161-f52c728f3f12b810.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
代码块是由从上到下的顺序依次编译,代码块一中alert(str)执行的时候存放预编译处理的容器还不存在str。代码块而虽然变量str已被预编译(即初始化)但还没有赋值,所以会出现无定义的结果。
此时代码相当于如下图:
(一)代码块
js中的代码块是由< script >标签分割的代码块。如下图:![](http://upload-images.jianshu.io/upload_images/1925161-1f6be976606810bf.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
js是按照代码块来进行编译和执行的,代码块之间相互独立,变量和方法可以共享。
![](http://upload-images.jianshu.io/upload_images/1925161-420a61060462d2db.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
代码块的编译是按照由上之下的顺序来进行编译和执行。如果var test = “我是代码块一变量”;放在 alert(str);后面,代码块运行的时候因为前面已经出错不会运行到这个位置。
(二)声明函数和定义函数
![](http://upload-images.jianshu.io/upload_images/1925161-6e7ffe7c9f576ff4.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
声明式函数与赋值式函数的区别在于:在JS的预编译期,声明式函数将会先被提取出来,然后才按顺序执行js代码。
(三)预编译期与执行期
预编译期js代码会对本代码块中的所有声明的变量和函数进行处理,但是需要注意的是处理的函数是声明式函数,变量也只是进行了声明但是未赋值。![](http://upload-images.jianshu.io/upload_images/1925161-17a20575125661bc.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
function Fn(){}已经被预编译,所有 Fn(); 无论写在其前还是其后都会运行。相当于 function Fn(){}已经被预先放置到一个容器里面,函数运行时可以直接从这个容器中提取。
这里要注意的是同名函数后者会覆盖前者。
![](http://upload-images.jianshu.io/upload_images/1925161-baeee7561a449ca5.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
同名函数会覆盖前面的函数。
![](http://upload-images.jianshu.io/upload_images/1925161-f52c728f3f12b810.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
代码块是由从上到下的顺序依次编译,代码块一中alert(str)执行的时候存放预编译处理的容器还不存在str。代码块而虽然变量str已被预编译(即初始化)但还没有赋值,所以会出现无定义的结果。
此时代码相当于如下图:
![](http://upload-images.jianshu.io/upload_images/1925161-c25125166f89e59e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
相关文章推荐
- JavaScript运行机制浅探
- JavaScript运行机制浅探
- javascript运行机制之执行顺序详解
- javascript运行机制之this详细介绍
- javascript运行机制之执行顺序详解(转)
- JavaScript运行机制浅探
- javascript运行机制之执行顺序详解4
- javascript运行机制
- JavaScript运行机制
- javascript运行机制之执行顺序详解
- JavaScript运行机制浅探
- JavaScript运行机制浅探
- JavaScript运行机制浅探
- javascript小记-javascript运行机制
- 透过Javascript一些变量定义及简单运算实验看JS内部运行机制
- javascript 运行机制
- Ext JavaScript 运行机制
- Javascript的运行机制
- 【转】javascript运行机制之this详解
- JavaScript 运行机制之执行顺序详解