一道JS面试题及分析

一道前端面试题引发了关于JS中函数声明和函数表达式的讨论。通常,函数声明允许先使用后声明,但在if语句中,`function f() {}`是一个函数表达式,用于判断其类型而非执行。理解这一差异对于避免运行时错误至关重要。

前几天,一个前端微信群里有这么一道题:

var y=1;
if( function f(){}){
     y += typeof f;
}
console.log(y);

第一反应呢,这个题答案应该式 1function ,可是结果出人意料,是 1undefined。

查阅资料后大致了解了原因。

这里涉及到一个知识点,就是函数声明和函数表达式。

(i)函数声明和函数表达式

在JS中,函数有两种类型。

函数声明形如这样:

function x(){

dosomething();

}

函数表达式,形如这样:

var x = function(){

dosomething();

}.

平常使用时,这两者似乎没有什么区别,所以这里常常是一个盲点。

函数声明,其实相当于一个定义,定义了 函数 x

而函数表达式,更倾向于一个赋值,向变量 x 赋值函数

而函数声明在代码运行过程中,可以先使用,后声明,也就是,函数使用的代码在前面,声明的代码在后面,出身C语言的童鞋们知道,要调用一个函数,要么在调用前,就定义好,要么就先声明,然后函数在后面写,而JS中简化了这种操作,只要函数被声明,那么在声明前调用和声明后调用都是可行的。

譬如:

1.

console.log(x);                   // function x(){ dosomething(); }

function x(){

dosomething();

}

2.

console.log(x);                     // undefined

var x = function(){

dosomething();

}

好,让我们看回这道题,我们需要搞懂的是,这里 if 里面的判断式 function f(){} 是一个声明还是一个表达式,看上去很像一个声明,但在这里,if语句里面,functionf(){} 其实是一个函数表达式,因为,if 语句期望从 function f(){} 中获得他的返回值(这里,是返回他的类型 object ,也就是 true),我们这样转换一下代码

var y=1;
var x=function f(){};
if( x ){
  y+= typeof f;
}
console.log(y);

这里就比较清晰了。同样的,while do~while 等判断语句中也是这个规律。

参考网址: http://stackoverflow.com/questions/336859/var-functionname-function-vs-function-functionname

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值