1 | Fn(); //执行结果:console.log在控制台打印提示 |
JS的解析过程分为两个阶段:预编译期(预处理)与执行期,页面加载过程中,浏览器会对页面上或载入的每个js代码块(或文件)进行扫描,如果遇到定义式函数,则进行预处理(类似于C等的编译),处理完成之后再开始由上至下执行;遇到赋值式函数,则只是将函数赋给一个变量,不进行预处理,待调用到的时候才进行处理。
代码块是指一对<script type="text/javascript"></script>标签包裹着的JS代码,文件就是指通过src导入页面的JS文件。
浏览器对每个代码块或文件进行独立的扫描,然后对全局的代码进行顺序执行。所以,在一个代码块(文件)中,函数可以在调用之后进行定义式定义(如案例一中的Fn()),但在两个独立的代码块中,定义函数所在的代码块必须在函数被调用的代码块之前。
1 | <script type="text/javascript"> |
1 | <script type="text/javascript"> |
1 | <script type="text/javascript"> |
因为在JS中重名的函数,后定义的会覆盖前面定义的函数,这种策略和JS的顺序执行也是有关系的。
1 | fn(); //控制台打印提示 2 |
body中内部的函数会先于onload的函数执行,body的onload事件触发条件是body内容加载完成,而body中的JS代码会在这一事件触发之前运行。
1 | function fnOnLoad(){ |
严格来说,JS是没有多线程概念的,所有的程序都是单线程依次执行的。 延时执行、Ajax异步加载只是看起来像多线程。
1 | function fn1(){ |
看上去,fn2()和延时程序是分两个过程再走,但其实,这是JS中的回调机制在起作用,类似于操作系统中的中断和响应 —— 延时程序设置一个中断,然后执行fn2(),待1000毫秒时间到后,再回调执行fn1()。
同样,4中body的onload事件调用的函数,也是利用了回调机制——body加载完成之后,回调执行fnOnLoad()函数。Ajax请求中的数据处理函数也是一样的道理。
在调用外部js进行相关验证的时候,中间会包涵部分中文,但是由于页面一般是使用utf-8作为编码,但是中文在utf-8显示乱码,成了一串乱七八糟的东西,所以在页面引用的时候,请加上编码格式。
1 |
|
参考网站