Heim > Fragen und Antworten > Hauptteil
Nachdem der folgende Code ausgeführt wurde, ist er undefined
<script type="text/javascript">
if (! 'a' in window) {
var a = 123;
}
console.log(a);
</script>
Erklärung 'a' in window
为 true
, aber wann wurde a deklariert? Bitte sagen Sie es mir, danke!
Ich habe den Code geändert in:
<script type="text/javascript">
if (! 'a' in window) {
a = 123;
}
console.log(a);
</script>
Das Ergebnisa is not defined
。 既然 a
wurde gemeldet, warum wird dieser Fehler gemeldet?
黄舟2017-06-12 09:34:55
先说变量提升吧
if (! 'a' in window) {
var a = 123;
}
console.log(a);
这段代码无论是否进入 if
的代码块内,a 都是存在的
因为在 JavaScript 执行时,所有通过 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 代码块。
具体可尝试以下例子
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,报错。
大家讲道理2017-06-12 09:34:55
这段执行没毛病啊,! 'a' in window
这个是false,然后a的赋值没执行,再console不就是undefined么。
如果想让赋值执行,判断条件改成!('a' in window)
就行了。
如果还没明白,查一下运算符优先级列表。
代言2017-06-12 09:34:55
var
声明的时候会发生变量提升,在编辑阶段就把代码声明放在函数或者代码开头,所以就变成这个样子:
<script type="text/javascript">
var a;
if (! ('a' in window)) {
a = 123;
}
console.log(a);
</script>
所以a in window
是true
。
至于
<script type="text/javascript">
if (! ('a' in window)) {
a = 123;
}
console.log(a);
</script>
代码不包含var a
。所以不存在变量提升的问题,所以a就没有声明过,所以!('a' in window)是true,所以a
是123
https://developer.mozilla.org...
阿神2017-06-12 09:34:55
你第一段就理解错了'a' in window
为 false!'a' in window
才为 true
才会执行 var a = 123;
才有 a 被赋值123 的存在