我认为这个根本的区别在于,undefined是Js语言类型,而undeclared却是一种Js语法错误吧。
--------------------------------- 解答第一部分---------------------------------------
在Js中,有两个表示‘空’的值undefined和null,其中比较有用的是 undefined。undefined 是一个值为 undefined 的类型。JavaScript语言也定义了一个全局变量,它的值是 undefined,这个变量也被称为undefined。 但是这个变量不是一个常量,也不是一个关键字。这意味着它的值可以轻易被覆盖。为了避免可能对 undefined 值的改变,一个常用的技巧是使用一个传递到匿名包装器的额外参数。在调用时,这个参数不会获取任何值。如下例子:
var undefined = 123;
(function(something, foo, undefined) {
// 局部作用域里的 undefined 变量重新获得了 `undefined` 值
})('Hello World', 42);

更好的例子是在早期的jQuery代码中(1.5版本前的jQuery中),你会发现第一行直接就是function(window, document, undefined)这样直接调用的。很多人不明白这里整个未定义的undefined变量有何用,其实这里的undefined就是这样来的。
该部分答案参考自 Javascript Garden: bonsaiden.github.com/JavaScri...(写得很好的Js怪癖教程,建议大家去看看!)
------------------------------解答第二部分---------------------------------
而undeclared则是一种语法错误,@孙大同 同学的答案,其实访问undeclared的变量并非会中断浏览器执行。在浏览器运行上下文中,undeclared出来的变量简单可以认为是没有这样 var a这样定义变量,Js引擎执行的时候,由于无法找到其对应的上下文(scope),会简单地认为该变量是全局的变量,就是会把该变量定义到window中去!
很多同学在写for (var i = 0, L = xx.length; i < L; i++) 这样的语句的时候,忘记写var是经常性的(包括我......),所以直接导致变量i和L变为全局变量,然后出错。不过,虽然出错,但变量i和L是可以访问滴~~~ 
参考 @zhiyelee 同学的更新,加入到这个答案里面:需要说明一点的是 变量没有使用var 显示声明,但是在使用前已经赋值,这个值是被隐性声明未全局变量。
即使是b = “null" 这样的代码,是可以使用window.b访问到,而且不会打断浏览器执行!
具体的证据在Mozilla的MDC社区文档中,参考链接 developer.mozilla.org/en/JavaSc... 里面有详细关于Var关键字导致的变量undeclared情况。
------------------------------综合装逼一下---------------------------------
综上来说,Js的动态运行是上面问题根本原因,Js解析器需要关键字var来确定变量的scope,而变量的上下文,我个人觉得,几乎就是Js全部的精髓!什么this关键字,闭包神马的都是上下文才能确定的!

 posted on 2012-10-18 14:55  刘卿  阅读(943)  评论(0编辑  收藏  举报