if (function f(){})中function f(){}为何会是true?

刷简书碰到一篇讲面试题的文章http://www.jianshu.com/p/55e54345829a

var x = 1;
if (function f() {}) {
    x += typeof f;
}
x;
A. 1
B. "1function"
C. "1undefined"
D. NaN

我选的A,判断是function f(){}没有明显的return,那么函数默认返回undefined,if语句根本不会执行。
答案以及浏览器执行结果是C. "1undefined",if语句执行了。
function f(){}为何会转换成true?烦请哪位能详细解释下或者给个说明的文章。

阅读 7k
4 个回答

因为function f(){}是个对象 , if的括号里面放的东西都会转换成true或者false .
上面如果写成 :

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

x就等于1了 , 因为function f(){}不等于true嘛 , 但是只有function f()的话 , if会把它强制转化成true 或者 false :

!!(function f(){})

这样得到的就是一个true了

function f(){}在定义函数!又不是调用函数!所以跟返回值有什么关系?

具体说它是一个函数表达式,函数表达式的值当然是函数。函数是什么?函数是一个对象。把任何对象转为布尔类型时都是true

第二个知识点是考察命名的函数表达式function f(){}就是一个命名的函数表达式。它的名字f只在函数体内部可见,所以外部取不到,当然是undefined

这些都是ES规范里面的,没事儿的时候多翻翻看。

if条件里面只是函数定义,而不是函数运行。函数本身是一个对象,判断为true

这道题我之前也想了好久,之后总算看懂了,看懂就觉得挺合理的。
这道题关键是,if (expression) 接收的是一个表达式,而不是一个 statement。
所以if (function f() {}) 里的 function f() {} 是作为一个函数表达式被处理,而不是一个函数声明,所以并没有声明一个 f 函数,上面等价于

var y=1;

if (youcannotfindme = function f(){} ){`

 y+= typeof f;

}
`console.log(y);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题