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 相关文章推荐
你真的了解JavaScript吗?
Feb 24 Javascript
js对象数组按属性快速排序
Jan 31 Javascript
DOM和XMLHttpRequest对象的属性和方法整理
Jan 04 Javascript
IE6背景图片不缓存问题解决方案及图片使用策略多个方法小结
May 14 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
Apr 04 Javascript
JavaScript+html5 canvas制作的百花齐放效果完整实例
Jan 26 Javascript
轻松搞定js表单验证
Oct 13 Javascript
js核心基础之构造函数constructor用法实例分析
May 11 Javascript
JS异步处理的进化史深入讲解
Aug 25 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
Aug 05 Javascript
Vue实现腾讯云点播视频上传功能的实现代码
Aug 17 Javascript
Vue.js中v-bind指令的用法介绍
Mar 13 Vue.js
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
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
php析构函数的简单使用说明
2015/08/24 PHP
PHP实现动态压缩js与css文件的方法
2018/05/02 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
2018/06/11 PHP
Yii2框架实现登陆添加验证码功能示例
2018/07/12 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
2019/04/17 PHP
jquery之empty()与remove()区别说明
2010/09/10 Javascript
js父页面中使用子页面的方法
2016/01/09 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
2016/12/23 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
Nuxt.js之自动路由原理的实现方法
2018/11/21 Javascript
JS实现获取自定义属性data值的方法示例
2018/12/19 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
2019/07/29 Javascript
[01:46]辉夜杯—打造中国DOTA新格局
2015/12/25 DOTA
[01:04:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第二场 1月31日
2021/03/11 DOTA
Python中条件判断语句的简单使用方法
2015/08/21 Python
简单谈谈python的反射机制
2016/06/28 Python
python中类变量与成员变量的使用注意点总结
2017/04/29 Python
浅谈Django学习migrate和makemigrations的差别
2018/01/18 Python
详解PyCharm配置Anaconda的艰难心路历程
2018/08/13 Python
分析python请求数据
2018/08/19 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
python多线程分块读取文件
2019/08/29 Python
简单了解Pandas缺失值处理方法
2019/11/16 Python
Pycharm中Python环境配置常见问题解析
2020/01/16 Python
keras slice layer 层实现方式
2020/06/11 Python
HTML4和HTML5之间除了相似以外的10个主要不同
2012/12/13 HTML / CSS
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
托管代码(Managed Code)和非托管代码(Unmanaged Code)有什么区别
2014/09/29 面试题
如何撰写岗位职责
2014/02/01 职场文书
大型公益活动策划方案
2014/08/20 职场文书
幼儿园教师岗位职责
2015/04/02 职场文书