JavaScript声明变量时为什么要加var关键字


Posted in Javascript onSeptember 29, 2014

在JavaScript中,var用来声明变量,但是这个语法并不严格要求,很多时修改,我们可以直接使用一个变量而不用var声明它。

var x = "XX"; 

y ="xxx";

诸如此类。这有一个问题,比如说在代码中的某一行,我想使用的一个已声明的变量x,结果由于打字或者拼写错误,这个变量被写成y了,结果相当于“隐式”声明了一个变量y,在实际编程过程中,这种错误有时比较难以发现。
当你在当前上下文内进行这种“隐式”声明时,JavaScript引擎会先在当前上下文中寻找是否之前有声明此变量,如果没有,再到上一级的上下文中去寻找,如果一直未找到,会最后在window上声明这个变量!
比如:

代码如下:

window. y = "hello"; 
function func(){ 
y = "OH, NO!!!"; 
} 
func(); 
alert(window.y); //#=> display "OH, NO!!!"

当上下文中的任意一层有这种“隐式”定义的变量时,那么该层的该变量会被修改,而不会在window上生成一个新的变量。(这种bug也挺讨厌的,尤其是封装的比较复杂的代码)
比如:

代码如下:

var x = "window.x"; 
function a() { 
var x = "a's x"; 
var b = function() { 
var c = function() { 
//no var! 
x = "c's x:"; 
}; 
alert("before c run,the b.x:" + x); 
c(); 
alert("after c run, the b.x:" + x); 
}; 
alert("a.x is:" + x); 
b(); 
alert("after b function runed, the a.x is:" + x); 
}; 
alert("before a run, window.x:" + x); 
a(); 
alert("after a run, window.x:" + x);

这里面有以下几层:window, func a, func b, func c一直作层级嵌套。window->a->b->c
window和a中,都有定义变量x,b中未定义该变量,在c中‘隐式'声明了一个x,该x最终修改了a变量的值。
牢记,在JavaScript中,声明变量,一定前面要加var .

Javascript 相关文章推荐
js文件缓存之版本管理详解
Jul 05 Javascript
js 判断控件获得焦点的示例代码
Mar 04 Javascript
jquery插件开发之实现md5插件
Mar 17 Javascript
jQuery显示和隐藏 常用的状态判断方法
Jan 29 Javascript
js自定义回调函数
Dec 13 Javascript
Node.js+Express配置入门教程
May 19 Javascript
vue动态组件实现选项卡切换效果
Mar 08 Javascript
Vue中如何实现proxy代理
Apr 20 Javascript
微信小程序实现时间预约功能
Nov 27 Javascript
vue实现的网易云音乐在线播放和下载功能案例
Feb 18 Javascript
详解vue 图片上传功能
Apr 30 Javascript
原生js+canvas实现下雪效果
Aug 02 Javascript
Javascript基础知识(三)BOM,DOM总结
Sep 29 #Javascript
Javascript基础知识(二)事件
Sep 29 #Javascript
Javascript基础知识(一)核心基础语法与事件模型
Sep 29 #Javascript
Javascript表单验证要注意的事项
Sep 29 #Javascript
使用phantomjs进行网页抓取的实现代码
Sep 29 #Javascript
Javascript获取CSS伪元素属性的实现代码
Sep 28 #Javascript
js获取元素相对窗口位置的实现代码
Sep 28 #Javascript
You might like
第十四节 命名空间 [14]
2006/10/09 PHP
PHP 和 XML: 使用expat函数(二)
2006/10/09 PHP
PHP文件下载实例代码浅析
2016/08/17 PHP
php微信开发自定义菜单
2016/08/27 PHP
Zend Framework处理Json数据方法详解
2016/12/09 PHP
一个很酷的拖动层的js类,兼容IE及Firefox
2009/06/23 Javascript
javascript 同时在IE和FireFox获取KeyCode的代码
2010/02/07 Javascript
自用js开发框架小成 学习js的朋友可以看看
2010/11/16 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
2012/12/07 Javascript
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
Mac/Windows下如何安装Node.js
2013/11/22 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
jQuery滚动条插件nanoscroller使用指南
2015/04/21 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
2018/05/11 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)
2020/03/07 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
javascript操作向表格中动态加载数据
2020/08/27 Javascript
分享15个最受欢迎的Python开源框架
2014/07/13 Python
python检测远程服务器tcp端口的方法
2015/03/14 Python
python 网络编程常用代码段
2016/08/28 Python
python中协程实现TCP连接的实例分析
2018/10/14 Python
详解python itertools功能
2020/02/07 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
2020/10/29 Python
IE滤镜与CSS3效果(详细整理分享)
2013/01/25 HTML / CSS
Yahoo-PHP面试题3
2012/01/14 面试题
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
2015/06/22 面试题
2015年清明节网上祭英烈留言寄语
2015/03/04 职场文书
庆元旦主持词
2015/07/06 职场文书
少先队中队工作总结
2015/08/14 职场文书
2016初一新生军训心得体会
2016/01/11 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript
Python编写冷笑话生成器
2022/04/20 Python