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 相关文章推荐
发布一个基于javascript的动画类 Fx.js
Nov 05 Javascript
利用了jquery的ajax实现二级联互动菜单
Dec 02 Javascript
parentElement,srcElement的使用小结
Jan 13 Javascript
jQuery中extend函数详解
Jul 13 Javascript
JavaScript入门教程之引用类型
May 04 Javascript
JavaScript交换两个变量值的七种解决方案
Dec 01 Javascript
JavaScript定时器实现的原理分析
Dec 06 Javascript
angularJS 指令封装回到顶部示例详解
Jan 22 Javascript
在页面中引入js的两种方法(推荐)
Aug 29 Javascript
关于angularJs清除浏览器缓存的方法
Nov 28 Javascript
javascript异常处理实现原理详解
Feb 17 Javascript
js+canvas实现转盘效果(两个版本)
Sep 13 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
解析php中memcache的应用
2013/06/18 PHP
php取整函数ceil,floo,round的用法及介绍
2013/08/31 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
用正则表达式 动态创建/增加css style script 兼容IE firefox
2009/03/10 Javascript
jqTransform form表单美化插件使用方法
2012/07/05 Javascript
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
JavaScript中判断对象类型的几种方法总结
2013/11/11 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
2014/04/16 Javascript
Javascript实现单例模式
2016/01/24 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
2016/07/12 Javascript
获取jqGrid中选择的行的数据
2016/11/30 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
2017/08/17 Javascript
thinkjs 文件上传功能实例代码
2017/11/08 Javascript
微信小程序实现卡片左右滑动效果的示例代码
2019/05/01 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
浅谈vue websocket nodeJS 进行实时通信踩到的坑
2020/09/22 NodeJs
vue组件实现移动端九宫格转盘抽奖
2020/10/16 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
2020/11/12 Javascript
python简单实现刷新智联简历
2016/03/30 Python
简单谈谈Python中的闭包
2016/11/30 Python
python输入整条数据分割存入数组的方法
2018/11/13 Python
Python 项目转化为so文件实例
2019/12/23 Python
python 爬取疫情数据的源码
2020/02/09 Python
40行Python代码实现天气预报和每日鸡汤推送功能
2020/02/27 Python
Python常用数字处理基本操作汇总
2020/09/10 Python
python实现图片转字符画的完整代码
2021/02/21 Python
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
教师敬业奉献模范事迹材料
2014/05/18 职场文书
绿色环保家庭事迹材料
2014/08/31 职场文书
喝酒驾驶检讨书
2014/10/01 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server
go语言中http超时引发的事故解决
2021/06/02 Golang
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python
室外天线与收音机天线杆接合方法
2022/04/05 无线电