hao_2468

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

先是看论坛上有人说了 createEventObject 这个东东,自己以前没用过 然后习惯性的GG一下,不错找到了

鸟食轩的博客:http://www.cnblogs.com/birdshome/archive/2005/06/30/183766.html

正好一路把javascript分类下的文章看了下来,看到上面的那一篇 感觉很怪,觉得应该会报语法错误而他上面写的是都会执行   这让我郁闷不已。不多说那就动手

<script type="text/javascript">
var a = "1", b = "2";
if(a == "1"){
alert("a="+a);
}
else(a == "b"){
alert("b="+a);
}
</script>

我不知道上面的对象对于在没有运行这段代码或是没见过类似写法人来说,他会得到什么结果?

会报错?还是会alert?

这个会除了opera会执行外其它会报语法错误:

opera 9.6:弹出a=1 及b=1

ff3.5:missing ; before statement

而下面这一段代码你会认为他会得到什么结果呢?

<script type="text/javascript">
var a = "1";
if(a == "1"){
alert("a="+a);
}
else(a == "b");{//注意这里()使用了回车或者你加上;(其它字符不行---是我最初理解错误,更正的在这里:http://hi.baidu.com/meteoric_cry/blog/item/f6457e231ff5b2589822ed8a.html,其它字符也能到行结束符的作用)
alert("b="+a);
}
</script>

<script type="text/javascript">
var a = "1";
if(a == "1"){
alert("a="+a);
}
else(a == "b")

{//注意这里()使用了回车或者你加上;(其它字符不行)
alert("b="+a);
}
</script>

下面的二段代码在我机器上跑出来的结果都一样:弹出 a=1 b=1

就是说二种方式可以避免浏览器在解析的时候出错:

1、使用回车键

2、使用分号

这是为什么? 在无忧论坛上看到以前的一个帖子:

http://bbs.51js.com/viewthread.php?tid=74205&highlight=###

感觉我遇到的问题与上面的问题一样,都是关于;与回车的问题。隐约中感觉到这样理解容易让我接受一点:

 
一条语句由一个或多个表达式、关键字或者运算符(符号)组成。典型地,一条语句写一行,尽管一条语句可以超过两行或更多行。两条或更多条语句也可以写在同一行上,语句之间用分号“;”隔开。通常,每一新行开始一条新语句。不过显式地终止语句是一个好方法。这是用分号 (;) 来实现的,分号是 JScript 语句的终止字符。

else(a == "1") {\n

chrome:Uncaught SyntaxError: Unexpected token {

IE7:出现运行时间错误,是否要进行调整\n\n xxx行\n错误: 缺少 ';'

------------更正

上面说法欠妥,如果遇到这样的问题,加了加车也没有用,<script type="text/javascript">
(function() {
   alert(1);
})()

(function() {
   alert(2);
})();
</script>貌似这个问题又会是另一种解释

--------------9月24日更正

可以先看帖子:http://bbs.51js.com/viewthread.php?tid=85236

上面()()   ()(),经过月影的指点。正确的理解应该是:(((fn)())())(),除了第一个括号外其它均为函数调用,而()在这中扮演的是"函数操作符"(我之前理解有误) 既然是函数操作符,那前面一定要是函数了 上面先alert(1),然后将执行 undefined(),因为函数默认返回值是undefined 而()是函数操作符,前面必须是函数。所以执行undefined()理所当然的是“缺少对象”----执行时错误非解析时错误,语法正确,执行出错。

而function() {}()这样将会是语法错误,为什么?帖子中winter已经指出了,也可以点击这里查看词法作用域:

http://www.v-ec.com/dh20156/article.asp?id=36

当function位于一行开始时 解析器总是认为它是一个声明 解析完函数声明 又遇到括号 就会认为语法错误。而前面加上一个一元运算符就可以 或是一个()-----此时的()不是函数操作符,而将会执行()内的表达式(function() {})() 这样是没有问题,void function() {}()也没有问题。因为解析这一行的时候,发现有function,先声明。然后发现前面有void ---》执行表达式    执行完之后执行()---》调用前面的函数     月影提及: js解析是普通的LALR规则吧 --编译原理中的一些概念

网上资料可以总结如下:

JavaScript引擎会优先解析var变量和function定义。在预解析完成后,才会执行代码。如果一个文档流中包含多个script代码段(用script标签分隔的js代码或引入的js文件),运行顺序是:

step1. 读入第一个代码段
step2. 做语法分析,有错则报语法错误(比如括号不匹配等),并跳转到step5
step3. 对var变量和function定义做“预解析”(永远不会报错的,因为只解析正确的声明)
step4. 执行代码段,有错则报错(比如变量未定义)
step5. 如果还有下一个代码段,则读入下一个代码段,重复step2
step6. 结束

到这里,不得不再推荐大家去看一本书:《javascript语言精髓与编程实践》--作者:周爱民,具体里面都有讲解

我是从卓越网上订的54.4RMB,二天就到了 后来又订了一本《javascript语言精粹》 看这两本有如提壶灌顶之感,而最近论坛有点乱糟糟的 让人心慌 0_0!

posted on 2010-06-22 17:34  hao_2468  阅读(363)  评论(0编辑  收藏  举报