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 相关文章推荐
jQuery 行背景颜色的交替显示(隔行变色)实现代码
Dec 13 Javascript
jquery使用animate方法实现控制元素移动
Mar 27 Javascript
JS日期加减,日期运算代码
Nov 05 Javascript
jQuery基础知识点总结(DOM操作)
Jun 01 Javascript
再谈javascript常见错误及解决方法
Sep 16 Javascript
Canvas + JavaScript 制作图片粒子效果
Feb 08 Javascript
Web制作验证码功能实例代码
Jun 19 Javascript
JS运动特效之完美运动框架实例分析
Jan 24 Javascript
React Native中Mobx的使用方法详解
Dec 04 Javascript
layer.prompt输入层的例子
Sep 24 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
Nov 12 Javascript
JavaScript实现字符串与HTML格式相互转换
Mar 17 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
在线增减.htpasswd内的用户
2006/10/09 PHP
不用mod_rewrite直接用php实现伪静态化页面代码
2008/10/04 PHP
解析PHP中的正则表达式以及模式匹配
2013/06/19 PHP
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
2014/05/05 PHP
php计划任务之ignore_user_abort函数实现方法
2015/01/08 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
php微信扫码支付 php公众号支付
2019/03/24 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
js计数器代码
2006/11/04 Javascript
asp.net 30分钟掌握无刷新 Repeater
2011/09/16 Javascript
node在两个div之间移动,用ztree实现
2013/03/06 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
2015/12/10 Javascript
浅谈jQuery 中的事件冒泡和阻止默认行为
2016/05/28 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
2016/07/12 Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
2016/08/10 Javascript
js判断是否为空和typeof的用法(详解)
2016/10/07 Javascript
React教程之封装一个Portal可复用组件的方法
2018/01/02 Javascript
vue.js实现照片放大功能
2020/06/23 Javascript
Python制作Windows系统服务
2017/03/25 Python
Python3操作SQL Server数据库(实例讲解)
2017/10/21 Python
更改Python的pip install 默认安装依赖路径方法详解
2018/10/27 Python
Django实现单用户登录的方法示例
2019/03/28 Python
Python将文字转成语音并读出来的实例详解
2019/07/15 Python
Django 解决model 反向引用中的related_name问题
2020/05/19 Python
CSS实现的一闪而过的图片闪光效果
2014/04/23 HTML / CSS
中国双语服务优势的在线购票及活动平台:247tickets
2018/10/26 全球购物
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
如何设定的weblogic的热启动模式(开发模式)与产品发布模式
2012/09/08 面试题
护理自荐信
2013/10/22 职场文书
元旦晚会邀请函
2014/01/27 职场文书
消防器材管理制度
2014/01/28 职场文书
酒店管理毕业生自我鉴定
2014/03/02 职场文书
学习雷锋做美德少年寄语大全
2014/04/09 职场文书
党的群众路线教育实践活动通讯稿
2014/09/10 职场文书
商务司机岗位职责
2015/04/10 职场文书
MySql按时,天,周,月进行数据统计
2022/08/14 MySQL