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的面向对象(一)
Nov 09 Javascript
jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
Jul 28 Javascript
JavaScript实现数组随机排序的方法
Jun 26 Javascript
Bootstrap BootstrapDialog使用详解
Feb 17 Javascript
vue使用watch 观察路由变化,重新获取内容
Mar 08 Javascript
Cropper.js 实现裁剪图片并上传(PC端)
Aug 20 Javascript
薪资那么高的Web前端必看书单
Oct 13 Javascript
详解Node.js中的Async和Await函数
Feb 22 Javascript
基于vue中css预加载使用sass的配置方式详解
Mar 13 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
Aug 08 Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
Sep 22 Javascript
JS闭包原理与应用经典示例
Dec 20 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
BBS(php & mysql)完整版(四)
2006/10/09 PHP
PHP基础知识回顾
2012/08/16 PHP
解析PHP中常见的mongodb查询操作
2013/06/20 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
php-app开发接口加密详解
2018/04/18 PHP
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
jQuery EasyUI 开源插件套装 完全替代ExtJS
2010/03/24 Javascript
如何让easyui gridview 宽度自适应窗口改变及fitColumns应用
2013/01/25 Javascript
javascript中直接引用Microsoft的COM生成Word
2014/01/20 Javascript
浅谈angularJS 作用域
2015/07/05 Javascript
JS获取随机数和时间转换的简单实例
2016/07/10 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
JavaScript之Map和Set_动力节点Java学院整理
2017/06/29 Javascript
JavaScript数组去重的多种方法(四种)
2017/09/19 Javascript
Vue实现动态创建和删除数据的方法
2018/03/17 Javascript
快速解决brew安装特定版本flow的问题
2018/05/17 Javascript
jquery 时间戳转日期过程详解
2019/10/12 jQuery
详解JavaScript的this指向和绑定
2020/09/08 Javascript
解读! Python在人工智能中的作用
2017/11/14 Python
python监控进程脚本
2018/04/12 Python
python正向最大匹配分词和逆向最大匹配分词的实例
2018/11/14 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
python实现吃苹果小游戏
2020/03/21 Python
python能在浏览器能运行吗
2020/06/17 Python
Python字符串格式化常用手段及注意事项
2020/06/17 Python
用python获取txt文件中关键字的数量
2020/12/24 Python
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
利用指针变量实现队列的入队操作
2012/04/07 面试题
大学生军训广播稿
2014/01/24 职场文书
2014年少先队工作总结
2014/12/03 职场文书
2014年审计人员工作总结
2014/12/19 职场文书
五年级学生期末评语
2014/12/26 职场文书
会议承办单位欢迎词
2015/09/30 职场文书
2016年秋季趣味运动会开幕词
2016/03/04 职场文书
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers