HTML:
- <script type="text/javascript">
- var x = "overriden";
- </script>
- <script src="myjs.js"></script>
myjs.js:
- $(document).ready(function(){
- var x = x || "default val";
- alert(x); // this alerts "default val" and not "overriden"
- });
由于某些原因,x最终会被设置为“默认值”,而不是“覆盖”,即使最初我将其设置为“覆盖”,甚至将脚本引用包含在myjs.j中.
解决方法
应用变量声明起重之后的内容:
- var x;
- x = 5;
- $(document).ready(function(){
- var x;
- x = x || "default";
- });
它看起来最近的x,并看到它的值是未定义的,这是一个错误的值,所以x被设置为“默认”.
如果他们在同一个范围内,你会很好,因为这些声明总是被提升到以上作业:
- var x = 5;
- var x = x || "default";
其实就是
- var x;
- x = 5;
- x = x || "default";
这被提出是完全没有意义的:
- $(document).ready(function(){
- x = x || "default";
- });
如果没有定义x,它将抛出一个ReferenceError.
所以要么在同一个范围内进行检查,要么执行以下操作:
- $(document).ready(function(){
- var x = window.x || "default";
- });
无效的属性读取不会引起ReferenceError,而只是返回undefined.