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 相关文章推荐
从数据结构分析看:用for each...in 比 for...in 要快些
Apr 17 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
Jan 02 Javascript
在Ubuntu上安装最新版本的Node.js
Jul 14 Javascript
浅谈javascript回调函数
Dec 07 Javascript
JS中dom0级事件和dom2级事件的区别介绍
May 05 Javascript
JavaScript中对象的不同创建方法
Aug 12 Javascript
javascript获取以及设置光标位置
Feb 16 Javascript
Windows安装Node.js报错:2503、2502的解决方法
Oct 25 Javascript
详解Vue中CSS样式穿透问题
Sep 12 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
Sep 27 Javascript
在vue中高德地图引入和轨迹的绘制的实现
Oct 11 Javascript
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
Mar 31 jQuery
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框架的性能
2008/01/10 PHP
如何使用php判断所处服务器操作系统的类型
2013/06/20 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
2014/07/28 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
2018/04/20 PHP
使用JQUERY Tabs插件宿主IFRAMES
2010/01/01 Javascript
js传参数受特殊字符影响错误的解决方法
2013/10/21 Javascript
javascript中的原型链深入理解
2014/02/24 Javascript
javascript读取Xml文件做一个二级联动菜单示例
2014/03/17 Javascript
与Math.pow 相反的函数使用介绍
2014/08/04 Javascript
JS实现的车标图片提示效果代码
2015/10/10 Javascript
浅谈jquery的map()和each()方法
2016/06/12 Javascript
Javascript获取随机数的实现方法
2016/06/22 Javascript
jQuery学习笔记之回调函数
2016/08/15 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
2016/09/09 Javascript
JavaScript实现Fly Bird小游戏
2016/12/15 Javascript
JS正则表达式验证密码格式的集中情况总结
2017/02/23 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
15个顶级开源JavaScript框架和库
2018/10/10 Javascript
今天,小程序正式支持 SVG
2019/04/20 Javascript
Vue发布项目实例讲解
2019/07/17 Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
2019/10/16 Javascript
jQuery实现form表单基于ajax无刷新提交方法实例代码
2019/11/04 jQuery
详解JavaScript 作用域
2020/07/14 Javascript
Python中使用md5sum检查目录中相同文件代码分享
2015/02/02 Python
python利用lxml读写xml格式的文件
2017/08/10 Python
python创建文件时去掉非法字符的方法
2018/10/31 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
分享一个H5原生form表单的checkbox特效代码
2018/02/26 HTML / CSS
HTML5 window/iframe跨域传递消息 API介绍
2013/08/26 HTML / CSS
简约控的天堂:The Undone
2016/12/21 全球购物
外企C语言笔试题
2013/11/10 面试题
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
捐款活动总结
2014/08/27 职场文书
2014年乡镇团委工作总结
2014/12/18 职场文书
Python实现位图分割的效果
2021/11/20 Python
SpringBoot详解执行过程
2022/07/15 Java/Android