javascript定义变量和优先级的问题
来源:互联网 发布:80端口关闭有什么影响 编辑:程序博客网 时间:2024/06/14 05:36
这里写链接内容
看下面的代码:
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);
以firefox测试,会弹出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 声明会提前到作用域顶端,但附值却不会———好纠结的设定,不知道为什么要这么搞。
现在放出文首问题的答案:
只会弹出两个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判断时会为真,因为aa确实存在了,值是undefined。所以if代码不会执行。后面两个alert我就不说了。
- javascript定义变量和优先级的问题
- JavaScript定义变量和变量优先级问题探讨
- static定义变量的特殊用法和static定义变量的优先级展示。
- JavaScript函数声明、变量声明及赋值的优先级问题
- javaScript中全局变量和局部变量的优先级考虑
- JavaScript中定义类的公共变量和私有变量
- javascript中的var定义的变量和没有var定义变量的区别
- javascript中定义类一级的私有变量和函数
- JavaScript的定义“静态函数”和“静态变量”
- JavaScript中基础变量和数据类型的定义
- JavaScript中let和var定义变量的区别
- javascript变量undefined和null的问题
- Javascript 函数声明 的优先级 高于 变量声明的优先级,但 不会 覆盖变量赋值
- C++中有关各种变量声明和定义的问题
- sql 定义变量的问题
- c++变量定义的问题
- JAVA && 和 || 优先级的问题
- javascript中运算符的优先级问题
- 黑马程序员--异常体系
- 二分图最大匹配,点的最小覆盖,最小路径覆盖
- 支付宝手机网页即时到账接口(1)之相关信息介绍
- iOS开发——封装自己的下拉菜单
- 矩阵相乘
- javascript定义变量和优先级的问题
- 递归实现厄密多项式
- 我的iOS开发 3-Objective-C分支结构
- 【Java】Java的多态性
- 高斯消元
- [置顶] 亲,这就是遗传算法
- No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
- PHP不同环境下的测试
- java TcpSocket编程小例子