search

Home  >  Q&A  >  body text

javascript - if语句判断条件中的非匿名函数表达式为什么无法调用?

  var x = 1;
  if (function f(){}) {
    x += typeof f;
  }
  x;

返回值为"1undefined"

它们应该是在同一作用域,为什么type语句调用不到f函数?

黄舟黄舟2819 days ago600

reply all(4)I'll reply

  • 巴扎黑

    巴扎黑2017-04-10 14:57:10

    这和if没有关系

    jsvar x = function f(){}; console.log(typeof x, typeof f);
    //function undefined
    

    这是函数表达式和函数声明语句的区别,前者带名字只会影响x.name而不会声明对应的变量,后者不仅会声明,还有提升的效果,比如

    jsconsole.log(typeof g); function g(){};
    //function
    

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 14:57:10

    函数表达式的函数名作用域是闭包内。除了IE8貌似有bug。

    reply
    0
  • 黄舟

    黄舟2017-04-10 14:57:10

    if ( expression ) statement
    

    所以這裏的 function f(){} 是一個函數表達式,over。

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 14:57:10

    很簡單了

    js var x = 1;
      if (function f(){}) {
        x += typeof f;
      }
      x;
    

    首先我們分析下, if裡面是true還是false. !!function f(){} -> true
    所以我們知道 x += typeof f; 要執行.

    又因為

    ECMA 5 (13.0) defines the syntax as

    javascriptfunction Identifieropt ( FormalParameterListopt ) { FunctionBody }
    

    所以f是沒有定義的, 於是typeof f 就是'undefined' 是一個string.

    1+'undefined' = '1undefined'. 所以答案就出來了.

    Ref:
    Function Declarations vs. Function Expressions

    reply
    0
  • Cancelreply