代码之家  ›  专栏  ›  技术社区  ›  Nelson Owalo

..if语句中未声明的变量不会引发错误

  •  1
  • Nelson Owalo  · 技术社区  · 6 年前

    if(a = 'A|B|C'.split('|'), a.length > 1){
      // I have access to a, but it was never declared as a variable?
    } else {
      // some code
    }
    
    // I still have access to 'a' over here?
    

    a 没有被声明,但是很明显,它指定了 'A|B|C'.split('|') 作为正常声明变量。

    此外,变量存在于 if 语句,我可以在下面的代码中访问它。

    if(let a = 'A|B|C'.split('|'), a.length > 1)
    

    抛出错误。这与 for, for ..in 循环,在使用之前必须声明变量。

    有人能解释一下这是怎么回事吗?

    3 回复  |  直到 6 年前
        1
  •  4
  •   cнŝdk    6 年前

    事实上 a window

    如果你看看 the MDN var reference

    将值赋给未声明的变量会在执行赋值时隐式地将其创建为全局变量(它将成为全局对象的属性)。

    所以这就是为什么你共享的代码工作得很好,而且没有抛出任何错误。

        2
  •  2
  •   z00md    6 年前

    首先,在下面的一行中有多个用逗号分隔的表达式。在JS中,从左到右计算每个表达式,并返回最后一个表达式。所以基本上这将工作如下

    if(a = 'A|B|C'.split('|'), a.length > 1){ // evaluate 'A|B|C'.split('|') and assign the value to a variable 'a' if it exists. Otherwise create a new global variable 'a' and assign the value.
    

    将转换为

    if(a,a.length > 1) // a gets assigned a value which 
    // here is an array consisting of 3 elements.["A","B","C"].
    

    将转换为

    if(["A","B","C"], ["A","B","C"].length > 1)
    

    将转换为

    if(true) // comma separated expression always 
    // returns the last expression's value which here would be true since a.length is 3
    

    您提到的第二个问题是,您不能在和if块中编写语句。使用var/let基本上就是一个语句。请记住,可以在if条件中编写表达式。

        3
  •  1
  •   Sami Ahmed Siddiqui Jakir Hossen    6 年前

    通常,JS不会对未声明的变量抛出错误,而是为它们赋值。

    如果您想得到这些类型的错误,那么使用 "use strict"; 函数顶部的行。

    “严格使用”;定义JavaScript代码应在“严格模式”下执行。例如,在严格模式下,不能使用未声明的变量。

    这是您提供的没有引发错误的代码:

    if(a = 'A|B|C'.split('|'), a.length > 1){
      // I have access to a, but it was never declared as a variable?
    } else {
      // some code
    }
    console.log(a);

    在这段代码中,我刚刚在顶部添加了strict指令,它开始抛出一个错误。

    "use strict";
    
    if(a = 'A|B|C'.split('|'), a.length > 1){
      // I have access to a, but it was never declared as a variable?
    } else {
      // some code
    }