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对象模型-执行模型
Apr 28 Javascript
Javascript中的delete介绍
Sep 02 Javascript
js生成缩略图后上传并利用canvas重绘
May 15 Javascript
JavaScript中for循环的使用详解
Jun 03 Javascript
原生js的RSA和AES加密解密算法
Oct 08 Javascript
浅谈angularjs module返回对象的坑(推荐)
Oct 21 Javascript
基于vue实现可搜索下拉框定制组件
Mar 26 Javascript
jQuery实现的页面详情展开收起功能示例
Jun 11 jQuery
解决layui 三级联动下拉框更新时回显的问题
Sep 03 Javascript
如何使用Javascript中的this关键字
May 28 Javascript
Vue实现购物车实例代码两则
May 30 Javascript
原生小程序封装跑马灯效果
Oct 21 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
《雄兵连》《烈阳天道》真的来了
2020/07/13 国漫
php初始化对象和析构函数的简单实例
2014/03/11 PHP
php gd等比例缩放压缩图片函数
2016/06/12 PHP
PHP实现适用于自定义的验证码类
2016/06/15 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
一个很酷的拖动层的js类,兼容IE及Firefox
2009/06/23 Javascript
javascript 45种缓动效果 非常酷
2011/06/28 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
javascript如何动态加载表格与动态添加表格行
2013/11/27 Javascript
JS获取各种宽度、高度的简单介绍
2014/12/19 Javascript
js打造数组转json函数
2015/01/14 Javascript
DIV随滚动条滚动而滚动的实现代码【推荐】
2016/04/12 Javascript
js原生实现FastClick事件的实例
2016/11/20 Javascript
浅谈js中同名函数和同名变量的执行问题
2017/02/12 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
vue动态删除从数据库倒入列表的某一条方法
2018/09/29 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
vueScroll实现移动端下拉刷新、上拉加载
2019/03/22 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
vue组件入门知识全梳理
2020/09/21 Javascript
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
python下读取公私钥做加解密实例详解
2017/03/29 Python
Python 实现链表实例代码
2017/04/07 Python
浅谈python中对于json写入txt文件的编码问题
2018/06/07 Python
Python实现最常见加密方式详解
2019/07/13 Python
基于pandas中expand的作用详解
2019/12/17 Python
Django 解决model 反向引用中的related_name问题
2020/05/19 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
TripAdvisor台湾:全球最大旅游网站
2018/08/26 全球购物
迟到早退检讨书
2014/02/10 职场文书
旅游节目策划方案
2014/05/26 职场文书
2016社区平安家庭事迹材料
2016/02/26 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers
Vue 打包后相对路径的引用问题
2022/06/05 Vue.js