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

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

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

返回值为"1undefined"

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


if ( expression ) statement

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


这和if没有关系

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

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

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

很簡單了

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


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

【热门文章】
【热门文章】