suchen

Heim  >  Fragen und Antworten  >  Hauptteil

javascript - Frage zur Förderung von Variablennamen?

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 windowtrue, 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?

巴扎黑巴扎黑2764 Tage vor605

Antworte allen(5)Ich werde antworten

  • 黄舟

    黄舟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' 字符串执行,得到了falsewindow 里没有 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,报错。

    Antwort
    0
  • 大家讲道理

    大家讲道理2017-06-12 09:34:55

    这段执行没毛病啊,! 'a' in window这个是false,然后a的赋值没执行,再console不就是undefined么。
    如果想让赋值执行,判断条件改成!('a' in window)就行了。

    如果还没明白,查一下运算符优先级列表。

    Antwort
    0
  • 代言

    代言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 windowtrue

    至于

    <script type="text/javascript">
    if (! ('a' in window)) {
      a = 123;
    }
    console.log(a);
    </script>

    代码不包含var a。所以不存在变量提升的问题,所以a就没有声明过,所以!('a' in window)是true,所以a123

    https://developer.mozilla.org...

    Antwort
    0
  • 阿神

    阿神2017-06-12 09:34:55

    你第一段就理解错了
    'a' in window 为 false
    !'a' in window 才为 true
    才会执行 var a = 123;
    才有 a 被赋值123 的存在

    Antwort
    0
  • 学习ing

    学习ing2017-06-12 09:34:55

    熊猫桑正解啊=_=

    Antwort
    0
  • StornierenAntwort