锁定老帖子 主题:函数申明和变量申明的微妙区别
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-09
哦,你的意思是说,这种奇怪的行为完全是解释引擎的主张了?
等有空了好好啃啃ecma262,看看这方面有没有明确的约定:) |
|
返回顶楼 | |
发表时间: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的声明的创建都放到前面了。 |
|
返回顶楼 | |
发表时间:2007-05-09
对了,dell,有没有ecma中文译本呢?
|
|
返回顶楼 | |
发表时间:2007-05-09
在rhino实现里面,函数的变量申明和内部函数申明是分开来管理的。
应该有一个先后,但是初始化函数的位置,又还是原来的位置。 初试化变量的时候,正如dlee所说,创建了一个空函数。 to sp42 你那个工具还没用过呢,看起来不错呢:) 在什么地方的? |
|
返回顶楼 | |
发表时间:2007-05-09
to sp42:
你的这个解释也有一些问题。另外由于JavaScript引擎创建声明的函数采用的是异步的方式,有些错误你使用调试器未必能跟踪到。因为你进入到调试器中以后,函数肯定是已经创建好了。 我再给出一种可能的解释。很多人认为JavaScript是一种解释型的语言,其实JavaScript完全是一种编译型的语言,它每次都是要将代码先编译到内存后然后才执行的。我估计它是将所有的外部代码也放在一个匿名函数之中来编译的,然后立即执行这个匿名函数。而其他的函数,除了在匿名函数中调用到(直接或间接)的以外,都是放在匿名函数执行完之后才以异步的方式来创建的。 以这种方式来实现,是一种效率较高的实现方式,因为编译或eval是一个相当慢的操作。 |
|
返回顶楼 | |
发表时间:2007-05-09
to dlee:
按你这种说法,就没有解释型语言了,我感觉;你能列举个完全没有中间状态的例子? 只要没有编译成中间文件,直接用源代码部署的语言,都应该归为解释型语言。 java这样有编译过程的语言,很多书上说它有解释型的特征呢。解释字节码嘛,也有道理。 |
|
返回顶楼 | |
发表时间:2007-05-09
jindw 写道 按你这种说法,就没有解释型语言了,我感觉,只要没有编译成中间文件,直接用源代码部署的语言,都应该归为解释型语言。
java这样有编译过程的语言,很多书上说它有解释型的特征呢。解释字节码嘛,也有道理。 兄弟,这一点你不需要跟我争论,因为解释型语言和编译型语言有着严格的区分。 如果你在计算机启蒙阶段使用过解释型的Basic语言(不是Visual Basic),它是一种真正的解释型语言。对于代码是逐句翻译,逐句解释并执行的,因此它的执行效率非常低。 而对于Perl、JavaScript、Ruby来说,它们都是脚本语言,但是它们并不是解释型语言,而是编译型语言。在执行之前,它们有一个明显的编译步骤。 后来的这些脚本语言与Basic相比,正因为它们引入了预先对于全部代码的编译步骤,而不是像早期解释型语言那样逐句解释,这才使得它们的性能得到的大幅提升,才有可能有能力承担繁重的工作。 |
|
返回顶楼 | |
发表时间:2007-05-09
呵呵,算我见识浅陋,basic没见过。
争论这个也确实没意思。 感觉,现在说解释型,编译型,不好用来区分语言的种类了。 大多语言都同时具有两种特征。 动态语言,静态语言来区分或许更合适。 |
|
返回顶楼 | |
发表时间:2007-05-09
呵呵,严格说来,其实现在所有现代高级编程语言都有一个编译的步骤,几乎已经不存在纯粹的解释型语言了。
所以很多未执行的函数中存在代码错误,JavaScript引擎都能够及早报告。如果是解释型语言,是不会有这种行为的。 考虑到JavaScript存在的编译步骤,最初提到的JavaScript代码的这种行为的解释就变得很合理了,因为这些代码并不是逐句解释执行的。 |
|
返回顶楼 | |
发表时间:2007-05-09
广义上的解释型语言是: 编译器和解释器为同一程序,中间码不保存为文件,而是在内存中,你感觉不到,就当解释语言理解了。如 python,javascript之类的
但如java,c# ,编译成 class,Il中间语言,你可以看到。性能稍好。 但如 c c++ 直接编译成操作系统可认识的指令,那当然最快了。 汇编是最快地。 |
|
返回顶楼 | |