论坛首页 Web前端技术论坛

函数申明和变量申明的微妙区别

浏览 17178 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-09  
哦,你的意思是说,这种奇怪的行为完全是解释引擎的主张了?

等有空了好好啃啃ecma262,看看这方面有没有明确的约定:)
0 请登录后投票
   发表时间:2007-05-09  
引用
先执行完所有外部的代码之后,才会创建声明的函数的


不好意思,dlee,对于第一段代码,我这里的MSM(MS Script Editor)显示的是“先创建声明的函数”再执行其它代码。如下图:

可见已经有"test1"。然后“逐语句”走到 “var test1 = 1; ”这里,此时MSM报:


便是alert()是1的结果。
所以是后来的var test1 = 1;这句override掉 function test1(){}了,
其实相当于是:
<script> 
function test1(){};//函数申明不能覆盖变量申明?  
var test1 = 1;   
alert(test1);   
</script>  


这也证明了jindw第二次发的代码:
<script> 
alert(test1());//这样也行???? 
var test1 = 1; 
function test1(){return 'xxx'}; 
</script> 
 


JS引擎把function的声明的创建都放到前面了。
0 请登录后投票
   发表时间:2007-05-09  
对了,dell,有没有ecma中文译本呢?
0 请登录后投票
   发表时间:2007-05-09  
在rhino实现里面,函数的变量申明和内部函数申明是分开来管理的。
应该有一个先后,但是初始化函数的位置,又还是原来的位置。

初试化变量的时候,正如dlee所说,创建了一个空函数。

to sp42 你那个工具还没用过呢,看起来不错呢:)
在什么地方的?
0 请登录后投票
   发表时间:2007-05-09  
to sp42:
你的这个解释也有一些问题。另外由于JavaScript引擎创建声明的函数采用的是异步的方式,有些错误你使用调试器未必能跟踪到。因为你进入到调试器中以后,函数肯定是已经创建好了。

我再给出一种可能的解释。很多人认为JavaScript是一种解释型的语言,其实JavaScript完全是一种编译型的语言,它每次都是要将代码先编译到内存后然后才执行的。我估计它是将所有的外部代码也放在一个匿名函数之中来编译的,然后立即执行这个匿名函数。而其他的函数,除了在匿名函数中调用到(直接或间接)的以外,都是放在匿名函数执行完之后才以异步的方式来创建的。

以这种方式来实现,是一种效率较高的实现方式,因为编译或eval是一个相当慢的操作。
0 请登录后投票
   发表时间:2007-05-09  
to dlee:
按你这种说法,就没有解释型语言了,我感觉;你能列举个完全没有中间状态的例子?
只要没有编译成中间文件,直接用源代码部署的语言,都应该归为解释型语言。

java这样有编译过程的语言,很多书上说它有解释型的特征呢。解释字节码嘛,也有道理。
0 请登录后投票
   发表时间:2007-05-09  
jindw 写道
按你这种说法,就没有解释型语言了,我感觉,只要没有编译成中间文件,直接用源代码部署的语言,都应该归为解释型语言。

java这样有编译过程的语言,很多书上说它有解释型的特征呢。解释字节码嘛,也有道理。

兄弟,这一点你不需要跟我争论,因为解释型语言和编译型语言有着严格的区分。

如果你在计算机启蒙阶段使用过解释型的Basic语言(不是Visual Basic),它是一种真正的解释型语言。对于代码是逐句翻译,逐句解释并执行的,因此它的执行效率非常低。
而对于Perl、JavaScript、Ruby来说,它们都是脚本语言,但是它们并不是解释型语言,而是编译型语言。在执行之前,它们有一个明显的编译步骤。

后来的这些脚本语言与Basic相比,正因为它们引入了预先对于全部代码的编译步骤,而不是像早期解释型语言那样逐句解释,这才使得它们的性能得到的大幅提升,才有可能有能力承担繁重的工作。
0 请登录后投票
   发表时间:2007-05-09  
呵呵,算我见识浅陋,basic没见过。
争论这个也确实没意思。

感觉,现在说解释型,编译型,不好用来区分语言的种类了。
大多语言都同时具有两种特征。

动态语言,静态语言来区分或许更合适。
0 请登录后投票
   发表时间:2007-05-09  
呵呵,严格说来,其实现在所有现代高级编程语言都有一个编译的步骤,几乎已经不存在纯粹的解释型语言了。
所以很多未执行的函数中存在代码错误,JavaScript引擎都能够及早报告。如果是解释型语言,是不会有这种行为的。

考虑到JavaScript存在的编译步骤,最初提到的JavaScript代码的这种行为的解释就变得很合理了,因为这些代码并不是逐句解释执行的。
0 请登录后投票
   发表时间:2007-05-09  
广义上的解释型语言是: 编译器和解释器为同一程序,中间码不保存为文件,而是在内存中,你感觉不到,就当解释语言理解了。如  python,javascript之类的

但如java,c# ,编译成 class,Il中间语言,你可以看到。性能稍好。

但如  c c++ 直接编译成操作系统可认识的指令,那当然最快了。

汇编是最快地。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics