var与Javascript变量隐式声明


Posted in Javascript onSeptember 17, 2009

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 相关文章推荐
动态修改DOM 里面的 id 属性的弊端分析
Sep 03 Javascript
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
Nov 25 Javascript
解决js图片加载时出现404的问题
Nov 30 Javascript
莱鸟介绍javascript onclick事件
Jan 06 Javascript
基于JavaScript实现弹出框效果
Feb 19 Javascript
原生JS和jQuery版实现文件上传功能
Apr 18 Javascript
jquery.multiselect多选下拉框实现代码
Nov 11 Javascript
在一个页面重复使用一个js函数的方法详解
Dec 26 Javascript
微信小程序仿朋友圈发布动态功能
Jul 15 Javascript
微信小程序实现横向增长表格的方法
Jul 24 Javascript
详解JavaScript之ES5的继承
Jul 08 Javascript
node.js通过Sequelize 连接MySQL的方法
Dec 28 Javascript
html数组字符串拼接的最快方法
Sep 16 #Javascript
在IE下获取object(ActiveX)的Param的代码
Sep 15 #Javascript
javascript 检测浏览器类型和版本的代码
Sep 15 #Javascript
不安全的常用的js写法
Sep 15 #Javascript
Mootools 1.2教程 滑动效果(Slide)
Sep 15 #Javascript
Mootools 1.2教程 同时进行多个形变动画
Sep 15 #Javascript
Mootools 1.2教程(21)——类(二)
Sep 15 #Javascript
You might like
PHP ajax 分页类代码
2008/11/13 PHP
PHP中设置一个严格30分钟过期Session面试题的4种答案
2014/07/30 PHP
php实现在限定区域里自动调整字体大小的类实例
2015/04/02 PHP
php实现数组中出现次数超过一半的数字的统计方法
2018/10/14 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
关于恒等于(===)和非恒等于(!==)
2007/08/20 Javascript
Bookmarklet实现启动jQuery(模仿 云输入法)
2010/09/15 Javascript
写给想学习Javascript的朋友一点学习经验小结
2010/11/23 Javascript
js定时器的使用(实例讲解)
2014/01/06 Javascript
JavaScript给按钮绑定点击事件(onclick)的方法
2015/04/07 Javascript
js字符串操作方法实例分析
2015/05/06 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
javascript动画算法实例分析
2015/07/31 Javascript
Web打印解决方案之证件套打的实现思路
2016/08/29 Javascript
Vue.js中的图片引用路径的方式
2017/07/28 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
javascript实现蒙版与禁止页面滚动
2020/01/11 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
Python 命令行非阻塞输入的小例子
2013/09/27 Python
python使用datetime模块计算各种时间间隔的方法
2015/03/24 Python
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
python正常时间和unix时间戳相互转换的方法
2015/04/23 Python
python关键字and和or用法实例
2015/05/28 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
Pycharm之快速定位到某行快捷键的方法
2019/01/20 Python
500行Python代码打造刷脸考勤系统
2019/06/03 Python
python 字典操作提取key,value的方法
2019/06/26 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
Django url 路由匹配过程详解
2021/01/22 Python
巴西宠物商店:Cobasi
2019/04/19 全球购物
美德少年事迹材料
2014/01/23 职场文书
面试自我介绍演讲稿
2014/04/29 职场文书
市级文明单位申报材料
2014/05/07 职场文书
2015大学迎新晚会主持词
2015/07/16 职场文书
MySQL触发器的使用
2021/05/24 MySQL