javascript - if语句判断条件中的非匿名函数表达式为什么无法调用?
黄舟
黄舟 2017-04-10 14:55:10
0
4
603
  var x = 1;
  if (function f(){}) {
    x += typeof f;
  }
  x;

返回值为"1undefined"

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

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

reply all(4)
巴扎黑

这和if没有关系

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

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

jsconsole.log(typeof g); function g(){};
//function
伊谢尔伦

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

黄舟
if ( expression ) statement

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

Ty80

很簡單了

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

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template