美团前端二面,读代码题求解
var a = 0;
if (true) {
a = 1;
function a() {}
a = 21;
console.log(a);
}
console.log(a);
求两次 console 出来的值。
答案是21 1。
本菜鸡想了很久也没想明白第二个为啥是1。。
求大佬解惑 ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
21 1 的输出结果不完全正确,在不同的浏览器下结果不同
在safari下结果为21 21
在chrome下结果为21 1
同时ECMAScript规范中说函数声明可以嵌套在条件语句块内,但是其运行的结果依赖于JS解析器的实现,其结果具有不确定性,不推荐在生产环境下使用
面试官告诉你为什么了吗?
老实说我怀疑这是个未定义行为,反正我是没找到标准中关于这种情况的说明。
根据结果来分析一下,我觉得根源在于js没有为闭包准备一个关键字。
代码简化一下变成这样:
代码块中有方法定义就会自动产生闭包, 因为有
{}
的存在它又最多只会提升到这段代码块的最上面, a就变成了这段代码块中的局部变量。a = 1
给"全局"变量 a 赋值在方法定义之后的
a=21
其实是给局部变量赋值。如果代码是这个样子我相信任何人都不会觉得难理解:
附 v8 的bytecode, node版本:v14.7.0
ECMAScript5标准里并没有描述“代码块里的函数声明”的行为,具体怎么执行要看引擎行为了,就上面的代码在Chrome和IE里执行结果就不同:
JSLint发现“语句块里声明函数”也会报错的,可以看看解释"Function declarations should not be placed in blocks"。
~出这样的面试题说明面试官比较虚
搜了一下块内函数声明,貌似这个可能是答案
如此解释,可?
我也同意微软的观点,面试官这样难为人真的好吗
非答案,贴个同样坑的代码