JavaScript运行过程中的“预编译阶段”和“执行阶段”


Posted in Javascript onDecember 16, 2015

 javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段,而在javascript中也有类似的“预编译阶段”(javascript的预编译是以代码块为范围<script></script>,即每遇到一个代码块都会进行  预编译>执行),了解javascript引擎的执行机理,将有助于在写js代码过程中的思路总结

首先科普下javascript中的两种声明方式,var和function,前者声明的是变量,后者声明的是方法

在预编译中,javascript对这两种声明做出了两种处理方案

<script>
var a = "1";

//声明变量a
 function b(){

//声明方法b
  
alert();

}

var c = function(){ //声明变量c


alert();

}
</script>

以上代码块中,a、c为变量赋值,b为函数声明,当执行以上的代码时,首先会进入预编译阶段,对与变量赋值a、c会在内存中开辟一块内存空间并指向变量名,且赋值为undefined

对于函数声明,则同样会进行开辟内存空间,但赋值的对象会将声明的函数赋值给函数名

预编译阶段:(PS:不管代码中声明变量和声明函数的顺序如何,在预编译阶段会先声明变量,再声明函数)

<script>

var a = undefined;


var c = undefined;

 

var b = function(){



alert();


} </script>

 执行阶段:

<script>

a = "1";


c = function(){



alert();


}
</script>

整体执行步骤:

<script>

var a = undefined;


var c = undefined;





var b = function(){



alert();


}


a = "1";


c = function(){



alert();


}
</script>

题目:

<script>

var a = "1";


function b(){



alert(a);



var a = "2";


}


b();
</script>

ps:javascript的预编译

     一、先预定义变量,再预定义函数

二、变量的预编译只作声明,不作初始化,初始化在执行时

 

三、function语句定义的函数,不仅声明了函数名,而且函数体也进行了处理

四、匿名函数不会预编译

function f(){      // 声明函数f  
return 1; } alert(f());       // 返回1 
var f = function(){    // 定义匿名函数f  
return 2; } alert(f());       // 返回2

先预定义了变量f,然后同名函数f()覆盖了变量f,所以第一次输出1;变量的预编译

var f = function(){    // 定义匿名函数f  
return 1; } 
alert(f());       // 返回1 
function f(){      // 声明函数f  
return 2; } 
alert(f());      // 返回1

先预定义了变量f,然后同名函数f()覆盖了变量f.

Javascript 相关文章推荐
jquery.validate分组验证代码
Mar 17 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
Mar 15 Javascript
js实现杯子倒水问题自动求解程序
Mar 25 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
Sep 02 Javascript
javascript对下拉列表框(select)的操作实例讲解
Nov 29 Javascript
js中传递特殊字符(+,&amp;)的方法
Jan 16 Javascript
javascript中mouseover、mouseout使用详解
Jul 19 Javascript
用jmSlip编写移动端顶部日历选择控件
Oct 24 Javascript
Vue axios 中提交表单数据(含上传文件)
Jul 06 Javascript
Express之托管静态文件的方法
Jun 01 Javascript
前端使用crypto.js进行加密的函数代码
Aug 16 Javascript
antd 表格列宽自适应方法以及错误处理操作
Oct 27 Javascript
Sublime Text 3常用插件及安装方法
Dec 16 #Javascript
基于MVC4+EasyUI的Web开发框架形成之旅之界面控件的使用
Dec 16 #Javascript
基于JavaScript获取鼠标位置的各种方法
Dec 16 #Javascript
javascript基于prototype实现类似OOP继承的方法
Dec 16 #Javascript
javascript数组克隆简单实现方法
Dec 16 #Javascript
Perl Substr()函数及函数的应用
Dec 16 #Javascript
javascript针对不确定函数的执行方法
Dec 16 #Javascript
You might like
PHP 编写大型网站问题集
2010/05/07 PHP
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
2012/07/31 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
2014/07/04 PHP
让getElementsByName适应IE和firefox的方法
2007/09/24 Javascript
asp.net和asp下ACCESS的参数化查询
2008/06/11 Javascript
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
浅谈javascript中基本包装类型
2015/06/03 Javascript
jQuery鼠标事件汇总
2015/08/30 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
用js实现博客打赏功能
2016/10/24 Javascript
微信小程序开发实战教程之手势解锁
2016/11/18 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
Javascript实现的StopWatch功能示例
2017/06/13 Javascript
利用Javascript实现一套自定义事件机制
2017/12/14 Javascript
JavaScript实现求最大公共子串的方法
2018/02/03 Javascript
谈谈JavaScript中super(props)的重要性
2019/02/12 Javascript
详解微信小程序回到顶部的两种方式
2019/05/09 Javascript
nodejs提示:cross-device link not permitted, rename错误的解决方法
2019/06/10 NodeJs
vue transition 在子组件中失效的解决
2019/11/12 Javascript
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
在VUE style中使用data中的变量的方法
2020/06/19 Javascript
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
编写Python脚本抓取网络小说来制作自己的阅读器
2015/08/20 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
python之信息加密题目详解
2019/06/26 Python
python3用PIL把图片转换为RGB图片的实例
2019/07/04 Python
浅析python redis的连接及相关操作
2019/11/07 Python
Python 数据分析之逐块读取文本的实现
2020/12/14 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
会计实习自我鉴定
2013/12/04 职场文书
四个太阳教学反思
2014/02/01 职场文书
六年级数学教学反思
2014/02/03 职场文书
小学生法制教育心得体会
2016/01/14 职场文书
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android
Python实现将多张图片合成MP4视频并加入背景音乐
2022/04/28 Python