扫码关注官方订阅号
下面这段代码执行后是 undefined
undefined
说明 'a' in window 为 true, 可是 a 在什么时候声明的呢?请教大家,谢谢!
'a' in window
true
我又把代码改成:
结果a is not defined。 既然 a 已经声明,为什么会报这个错误呢?
a is not defined
a
先说变量提升吧
if (! 'a' in window) { var a = 123; } console.log(a);
这段代码无论是否进入 if 的代码块内,a 都是存在的
if
因为在 JavaScript 执行时,所有通过 var 定义的变量以及声明式函数都会被提升到当前作用域的顶部
var
而通过 var 创建的变量是没有块级作用域的,所以会提升到当前函数作用域的顶部
在全局作用域定义的变量都是 window 的属性
所以这段代码实际上执行的时候是这样的顺序
var a; if (! 'a' in window) { a = 123; } console.log(a); // undefined
定义了 a,但没有赋值,自然输出了 undefined
关于其中! 'a' in window 其实是先对 'a' 字符串执行非,得到了false,window 里没有 window.false 这个属性,返回了 false,没有进入 if 代码块。
! 'a' in window
'a'
false
window
window.false
具体可尝试以下例子
false in window; // false window.false = 123; false in window; // true !false in window; // false true in window; // false window.true = 456; !false in window; // true 'true' in window; // true
第二个问题
if (! 'a' in window) { a = 123; } console.log(a); // Uncaught ReferenceError: a is not defined
看懂了上面这个就很简单了,没用 var 定义(不存在提升),又没进 if,导致没有定义 a,报错。
这段执行没毛病啊,! 'a' in window这个是false,然后a的赋值没执行,再console不就是undefined么。如果想让赋值执行,判断条件改成!('a' in window)就行了。
!('a' in window)
如果还没明白,查一下运算符优先级列表。
var声明的时候会发生变量提升,在编辑阶段就把代码声明放在函数或者代码开头,所以就变成这个样子:
<script type="text/javascript"> var a; if (! ('a' in window)) { a = 123; } console.log(a); </script>
所以a in window是true。
a in window
至于
<script type="text/javascript"> if (! ('a' in window)) { a = 123; } console.log(a); </script>
代码不包含var a。所以不存在变量提升的问题,所以a就没有声明过,所以!('a' in window)是true,所以a是123
var a
123
https://developer.mozilla.org...
你第一段就理解错了'a' in window 为 false!'a' in window 才为 true才会执行 var a = 123;才有 a 被赋值123 的存在
!'a' in window
var a = 123;
熊猫桑正解啊=_=
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
先说变量提升吧
这段代码无论是否进入
if的代码块内,a 都是存在的因为在 JavaScript 执行时,所有通过
var定义的变量以及声明式函数都会被提升到当前作用域的顶部而通过
var创建的变量是没有块级作用域的,所以会提升到当前函数作用域的顶部在全局作用域定义的变量都是 window 的属性
所以这段代码实际上执行的时候是这样的顺序
定义了
a,但没有赋值,自然输出了undefined关于其中
! 'a' in window其实是先对'a'字符串执行非,得到了false,window里没有window.false这个属性,返回了false,没有进入 if 代码块。具体可尝试以下例子
第二个问题
看懂了上面这个就很简单了,没用
var定义(不存在提升),又没进if,导致没有定义 a,报错。这段执行没毛病啊,
! 'a' in window这个是false,然后a的赋值没执行,再console不就是undefined么。如果想让赋值执行,判断条件改成
!('a' in window)就行了。如果还没明白,查一下运算符优先级列表。
var声明的时候会发生变量提升,在编辑阶段就把代码声明放在函数或者代码开头,所以就变成这个样子:所以
a in window是true。至于
代码不包含
var a。所以不存在变量提升的问题,所以a就没有声明过,所以!('a' in window)是true,所以a是123https://developer.mozilla.org...
你第一段就理解错了
'a' in window为 false!'a' in window才为 true才会执行
var a = 123;才有 a 被赋值123 的存在
熊猫桑正解啊=_=