2007-06-30
JS几处怪癖的语义
带ID的函数表达式:
按照ECMA262定义,上面这段脚本等价于:
注意:fnid在with外是不可见的,但是IE没有严格遵守ECMA规范(同样的情况发生在catch语法上)。在IE上相当于:
在刚刚发布的JSA1beta上,还不能处理这个问题(新版本将这周内发布)。同时,鉴于这种语法在不同浏览器上表现不同,还是建议尽量避免使用(这点上,我个人还是更喜欢ie的方式)。
var语句:
太常用了,但是,没有注意还是很容易出问题。
var 用来声明全局或函数变量,但是,只是申明,重复申明也不能置空,范围是函数或者全局空间,位置在函数或脚本顶端,与块无关,这些与常用高级语言区别很大。
怪癖的代码
常见错误有:
var fn = function fnid(){};
按照ECMA262定义,上面这段脚本等价于:
with({fnid:null}){
var fn = fnid = function(){};
}
注意:fnid在with外是不可见的,但是IE没有严格遵守ECMA规范(同样的情况发生在catch语法上)。在IE上相当于:
var fnid = function(){};
var fn = fnid;
在刚刚发布的JSA1beta上,还不能处理这个问题(新版本将这周内发布)。同时,鉴于这种语法在不同浏览器上表现不同,还是建议尽量避免使用(这点上,我个人还是更喜欢ie的方式)。
var语句:
太常用了,但是,没有注意还是很容易出问题。
var 用来声明全局或函数变量,但是,只是申明,重复申明也不能置空,范围是函数或者全局空间,位置在函数或脚本顶端,与块无关,这些与常用高级语言区别很大。
怪癖的代码
var vaiable =0;
function test(){
variable =1;//别担心,不会改动全局变量vaiable
//do ........
var vaiable;//变量申明无顺序(一律置顶),只是赋值有顺序。
}
常见错误有:
var flag;//这里可能有人(包括我自己)喜欢自做聪明的利用一下变量的初始值undefined
while(!flag){//没准那个角落里面已经给当前函数内同名变量给赋值了就惨了
//.....
}
- 16:22
- 浏览 (2814)
- 评论 (2)
- 分类: JavaScript
- 进入论坛
- 相关推荐
评论
hax
2007-07-01
btw,var的最大问题是他的作用域是函数,而不是block。例如下面的:
alert(x);
if (a = 1) {
var x = 1;
} else {
var x = 2;
}
alert(x);
js2引入了let,来替代var。
alert(x);
if (a = 1) {
var x = 1;
} else {
var x = 2;
}
alert(x);
js2引入了let,来替代var。
hax
2007-07-01
第一个问题是ie的bug!因为fnid的主要目的是为了函数内部递归调用之用,省得你写arguments.callee那么长。。。
至于说你更喜欢ie的做法,也许jscript团队的想法跟你一致。但是这不是它违背ecma规范的理由,否则他们就不能声称自己是ecma的实现。类似的问题还有{}和[]初始化的问题: var x = [1,2,3,]长度应该是3,但是jscript是4。var obj={a:1,b:2,c:3,}按照规范是合法的,jscrript会报语法错。
我建议jsa的最佳做法是:如果开启一个所谓的jscript兼容选项,就把function expression的fnid去掉,其内部的fnid替换成arguments.callee。
你最后一个代码段会发生问题的情况只是在这段语句之前已经有地方写了 flag = xxx了。这种情况确实少见,建议jsa给出warning!
至于说你更喜欢ie的做法,也许jscript团队的想法跟你一致。但是这不是它违背ecma规范的理由,否则他们就不能声称自己是ecma的实现。类似的问题还有{}和[]初始化的问题: var x = [1,2,3,]长度应该是3,但是jscript是4。var obj={a:1,b:2,c:3,}按照规范是合法的,jscrript会报语法错。
我建议jsa的最佳做法是:如果开启一个所谓的jscript兼容选项,就把function expression的fnid去掉,其内部的fnid替换成arguments.callee。
你最后一个代码段会发生问题的情况只是在这段语句之前已经有地方写了 flag = xxx了。这种情况确实少见,建议jsa给出warning!
- 浏览: 203637 次
- 性别:

- 来自: 初到北京

- 详细资料
搜索本博客
最新评论
-
JSI 类库文件格式探讨
应该是jsa啥时候有新版本
-- by dingyuan -
JSI 类库文件格式探讨
jsi啥时候放新版本啊
-- by dingyuan -
最近工作上比较郁闷
一个人犯错误不要紧,总要得是能从错误中吸取教训,并且不要再犯第二次。我觉得不应该 ...
-- by twfx -
2008年我可以做一些什么
呵呵,开始了一些,完成了一些,黄掉了一些。
-- by jindw -
2008年我可以做一些什么
你的计划开始了吗?
-- by programmer






评论排行榜