解释型语言究竟是怎么执行的?
“所谓解释型语言,就是代码在执行时才被解释器一行行动态翻译和执行,而不是在执行之前就完成翻译。简单说,解释型语言就是边翻译边执行,而编译型语言是先编译后执行,两者的操作过程不同。”
“所谓解释程序是高级语言翻译程序的一种,它将源语言(如BASIC)书写的源程序作为输入,解释一句后就提交计算机执行一句,并不形成目标程序。就像外语翻译中的“口译”一样,说一句翻一句,不产生全文的翻译文本。这种工作方式非常适合于人通过终端设备与计算机会话,如在终端上打一条”
“Interpreted computing languages are languages whose source code is processed by a software program called an interpreter that reads in the text and immediately acts upon the instructions defined by the text.”
那看下下面这段程序——
var scope = 'global';
var f = function() {
console.log(scope); // 输出undefined
var scope = 'f';
}
f();
上面这段程序会输出undefined,原因是执行console.log(scope);时程序会发现函数内的那个变量scope“已经定义但没初始化”。那我的问题就是,如果解释型语言是解释一句执行一句的话,当执行console.log(scope);时它怎么知道函数里有个变量scope?
------解决方案--------------------
js变量声明是放在代码执行之前的
只需记住:同一片作用域,相同的变量名指代的必定是同一个变量
不止这个,还有很多类似看似神奇的,对js机制理解深了自然明白,不理解解释也是枉然
------解决方案--------------------JavaScript解析过程可以分为编译和执行两个阶段,也会预编译的,如变量定义,函数定义
var f = function() {
console.log(scope); // 输出undefined ,预编译,生成变量scope,值为undefined,由于解释性,赋值语句晚于上面那句,就输出undefined了
var scope = 'f';
}
楼主研究这个帖子下,包你头更加痛
http://bbs.csdn.net/topics/390300541
------解决方案--------------------"读一行,运行一行"这理解本身就是错误的,至少语法检查是有的,遇到错,前面的也不会执行:
alert("下面有错,我执行了吗?");
if(for())
------解决方案--------------------执行的时候是行解释
但是执行前还是要加载的
------解决方案--------------------4楼正解
解释语言 也存在一个预编译的过程的。。
语法上的错误 它会在预编译过程中就被返回