当我使用全局作用域变量没有'var',它显示我错误.为什么
when I use global scope variable without 'var', its showing me Error. why?
参见下面的示例代码
<script>
alert(a); // undefined
alert(b); // It is Error, b is not defined.
var a=1;
b=10;
</script>
当变量a和b都在全局作用域中时,为什么我得到b的错误消息,而变量a没有错误消息?原因是什么?
谁能解释一下?
第一个alert
显示undefined
,因为var
语句被提升到封闭作用域的顶部,换句话说,var
语句和function
声明在实际代码执行之前,在解析阶段进行。
当你的代码执行时,等于:
var a; // declared and initialized with `undefined` before the code executes
alert(a); // undefined
alert(b); // ReferenceError, b is not declared.
a=1;
b=10;
第二个alert
甚至没有执行,试图访问b
给你一个ReferenceError
,因为你从来没有声明过它,你试图访问它。
这就是Javascript中标识符解析过程的工作方式,如果在所有作用域链中都没有找到标识符,则抛出ReferenceError
异常。
b = 10
)并没有在技术上声明变量,即使在全局作用域中,效果也可能类似(并且似乎有效),在标识符结束时作为全局对象的属性,例如:
var a = 1;
b = 10;
// Similar effect:
window.a; // 1
window.b; // 10
但是这仅仅是因为全局对象是作用域链的最顶层环境记录。
上面两者的另一个区别是,用var
声明的标识符在全局对象上产生一个不可配置的属性(不能被删除),例如:
delete window.a; // false
delete window.b; // true
同样,如果您在函数的作用域内,并且对未声明的标识符进行赋值,则它最终将成为全局对象的属性,就像上面的示例一样,而var
语句将创建一个局部变量,例如:
(function(){
var a = 1;
b = 10;
})();
typeof window.a; // 'undefined', was locally scoped in the above function
typeof window.b; // 'number', leaked, an unintentional global
我真的不鼓励对未声明的标识符进行赋值,总是使用var
来声明变量,此外,这在ECMAScript 5严格模式下是不允许的,对未声明的标识符进行赋值会抛出ReferenceError
:
(function(){'use strict'; b = 10;})(); // throws a ReferenceError
相关文章:
- 当var==0时,我如何显示一个警报
- 将我的var显示为HH:mm(javascript)
- JavaScript var 分配一个动态可为空的值显示脚本错误
- var.push 并在 HTML 页面中显示我的新临时信息
- 如何从配置文件中获取$var以显示在模板中
- PHP var 显示在 Chrome Dev Tool 中,但不显示在网页中
- JavaScript JQuery String Var 显示在字段中
- 使用jQuery在HTML中显示var
- 如何在javascript中显示显示var值的警报
- 如果var status = 'Processing',我如何在格式化器中显示删除按钮?
- 在JavaScript中,console.log给出了for循环的每个值.但是var.text只显示最后一个值.这是为什
- jsDocToolkit方法、字段和属性don't在使用self-var时显示
- 如何在html中显示var值为十进制后的两位数字
- 秒表/计时器,保存var并显示在高分列表(HTML, JS)
- 当我使用全局作用域变量没有'var',它显示我错误.为什么
- 如何在Gridview标签中显示javascript var值
- 显示会话var而不刷新页面
- VAR显示从Javascript到PHP显示
- 显示一个DIV, VAR为CLASS
- 改变定时器从var = 1200显示mm:ss的标题