JavaScript定义变量和变量优先级问题探讨


Posted in Javascript onOctober 11, 2014

看下面的代码:

if (!("aa" in window)) {  

    alert('oh my god');

    var aa = 1;  

}  

alert("aa" in window);

alert(aa);

回答以下问题:

会报错吗?会弹出几次?
第2个alert是true还是false?
第3个alert弹出什么?
为什么?
思考下,然后测试下,如果你回答正确,那么后面的文章就不用看了。

-----------------------------

在JS里定义变量太简单了,直接一个var ,甚至不用var都可以:

var a = 1;

这里a就是变量名,1就是变量值。唉,这个太基础了。看下面的代码:
var a;

alert(a);

以firebug测试,会弹出undefined,这个是大家很熟悉的一个字符串了,貌似表示变量未定义。但我觉得,我已经var了啊,这就是定义了嘛,只是没有附值而已。

我们来个真正的没有定义的:

alert(a);

没错,就是直接alert一个根本没有出现过的变量,这会如何?

firebug直接报错了:a is not defined.意思是a没有定义。这个结合前面的代码来看,让人困惑。这个没有定义和前面的未定义有什么不同呢?

其实前面的代码等价于这样的:

var a = undefined;

alert(a);

也就是说,当声明变量而不赋值时,JS会给变量传一个undefined值,注意,这是个“值”,说明a已经有值了,这个值就叫“未定义”。

而后面的直接alert,变量从没有出现过,也就是说这才是真正的未定义。

简单的说:JS中不存在没有值的变量,变量声明的时候就赋值了。

然后我们看下面的代码:

alert(a);

var a = 1;

这个代码会报错吗?因为在alert的时候变量a还没来得及出现呀。

但是这样居然没有报错,而是弹出了undefined值。表明变量a已经存在了,只是值却不是我们想要的,而是undefined。这又是个什么问题呢?

因为var 变量声明和函数声明一样,会提前,其实上面的代码是这样的:

var a;

alert(a);

a = 1;

这么一来就懂了。

所以,这个问题的关键在于:var 声明会提前到作用域顶端,但附值却不会———好纠结的设定,不知道为什么要这么搞。个人觉得这是JS的一个缺陷。

现在有一种代码习惯,主张把变量声明一律放在作用域前方,大概就是考虑到这个——反正就算你不写在前方,JS也会提前到前方。

现在放出文首问题的答案:

只会弹出两个alert,而if里面的alert不会执行,因为var声明的提前性,导致真正的代码是这个样子:

var aa;

if (!("aa" in window)) {  

    alert('oh my god');

    aa = 1;  

}  

alert("aa" in window);

alert(aa);

虽然aa为空,但用'aa' in window判断时会为真,因为a确实存在了,而值是undefined。所以if代码不会执行。后面两个alert我就不说了。

个人感觉这是一个很无厘头的问题,我们应该了解他的原因,但鄙视他这种陷阱。

上面这个问题也是我写这篇文章的缘由,这段代码是我从一篇网文里看到的,但他里面没有答案,我百撕不得骑姐,跑到stackoverflow上去问了才搞清楚。答案就是这篇文章。

但这是很基础的问题啊其实!!!

哈哈,原谅我,后面还有一个问题:

var b = {}

alert(b.aa);

alert(b.aa.bb);

这也是一种声明变量的方式,那么,这段代码会报错吗?为什么?
Javascript 相关文章推荐
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
Aug 15 Javascript
html 锁定页面(js遮罩层弹出div效果)
Oct 27 Javascript
jQuery on方法传递参数示例
Dec 09 Javascript
JavaScript实现给定时间相加天数的方法
Jan 25 Javascript
JS中创建函数的三种方式及区别
Mar 13 Javascript
JavaScript中的splice方法用法详解
Jul 20 Javascript
webpack+vue.js实现组件化详解
Oct 12 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
Dec 30 Javascript
详解Vue整合axios的实例代码
Jun 21 Javascript
js 发布订阅模式的实例讲解
Sep 10 Javascript
基于vue-resource jsonp跨域问题的解决方法
Feb 03 Javascript
超轻量级的js时间库miment使用解析
Aug 02 Javascript
JavaScript中获取鼠标位置相关属性总结
Oct 11 #Javascript
JavaScript中最简洁的编码html字符串的方法
Oct 11 #Javascript
原生Javascript封装的一个AJAX函数分享
Oct 11 #Javascript
探讨js字符串数组拼接的性能问题
Oct 11 #Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
Oct 10 #Javascript
Jquery $.getJSON 在IE下的缓存问题解决方法
Oct 10 #Javascript
js点击button按钮跳转到另一个新页面
Oct 10 #Javascript
You might like
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
2017/04/09 PHP
CI框架附属类用法分析
2018/12/26 PHP
PDO::lastInsertId讲解
2019/01/29 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
2020/04/22 PHP
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
2010/01/22 Javascript
JS高级笔记
2011/07/13 Javascript
妙用Jquery的val()方法
2012/06/27 Javascript
javascript实现日历控件(年月日关闭按钮)
2012/12/12 Javascript
location.href用法总结(最主要的)
2013/12/27 Javascript
jquery实现邮箱自动补全功能示例分享
2014/02/17 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
javascript实现日历效果
2019/06/17 Javascript
跟老齐学Python之开始真正编程
2014/09/12 Python
Python基于Tkinter实现的记事本实例
2015/06/17 Python
使用python读取txt文件的内容,并删除重复的行数方法
2018/04/18 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
Pytorch GPU显存充足却显示out of memory的解决方式
2020/01/13 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
Flask模板引擎Jinja2使用实例
2020/04/23 Python
Python logging日志库空间不足问题解决
2020/09/14 Python
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
REN Clean Skincare官网:英国本土有机护肤品牌
2019/02/23 全球购物
怎样声明接口
2014/09/19 面试题
业务经理岗位职责
2013/11/11 职场文书
调解员先进事迹材料
2014/02/07 职场文书
档案室主任岗位职责
2014/02/12 职场文书
不打扫卫生检讨书
2014/02/12 职场文书
应届生求职信
2014/05/31 职场文书
学校党的群众路线教育实践活动总结报告
2014/07/03 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
小学生六年级作文之关于感恩
2019/08/16 职场文书
Python爬虫 简单介绍一下Xpath及使用
2022/04/26 Python
IDEA中sout快捷键无效问题的解决方法
2022/07/23 Java/Android