一些javascript面试题(二)函数声明与函数表达式

f = function() {return true;};
g = function() {return false;};
(function() {
if (g() && [] == ![]) {
f= function f() {return false;};
function g() {return true;}
alert(f());
alert(g());
}
})();
alert(f()); // true or false ? (原面试只有这一个alert,我是为了测试,加了其它三个)
alert(g());


这道题很多人应该都见过,我在网上看到了很多解释,但是感觉总有一些不对,拿出来和大家分享一下。
前三行没什么好说的,第四行里大家要注意一下,函数声明即function g() {return true;} 总是最先执行的,所以在匿名函数内部g()为true,[] == ![]也为true;(具体原因有时间在细说)。

f= function f() {return false;};这句按照EMCAScript规则应该为函数表达式,但ie8会将同时认为为函数声明。
如果是函数声明的话,就会产生两个function f对象,这时 f= function f() {return false;}; 中的f引用指向的是匿名函数内的f声明,即function f() {return false;};
它的变化不会导致外部函数的变化。
所以这时的结果为false,true,true,false;(ie8浏览器)
如果浏览器认定是函数表达式的话,这时就是原有的f = function() {return true;};
重新指向了function() {return false;};,即函数内外的引用是同一个,在匿名函数内部
f发生变化时会同时影响到外部。
所以这时的结果为false,true,false,false;(符合EMCAScript规范的浏览器)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值