首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >震惊!99%的人都会做错的面试题

震惊!99%的人都会做错的面试题

作者头像
用户9914333
发布2022-07-22 14:51:28
发布2022-07-22 14:51:28
2840
举报
文章被收录于专栏:bug收集bug收集

今天和大家分享一道面试题

代码语言:javascript
复制
var a = 1;
(function a() {
    a = 2;
    console.log(a);
})();

先思考!

先思考!

先思考!

先思考!

结果为?

代码语言:javascript
复制
// 输出结果为函数 a
a() {
    a = 2; 
    //这里的 a=2 相当于是修改函数 a.name=2
    console.log(a);
}

原因:

首先,不存在变量提升和函数提升的问题,因为 (function (){}){} 是自执行函数,(function (){})是表达式;

这里的重点很明显是 a=2;

这行代码,因为 {} 就是作用域,

那么 a=2 执行的不是给全局变量 a 赋值为 2,

而是想要将自执行函数的name 'a', 更改为 2

但这句话在 console.log 后证实未执行,即这句代码被忽略了。

(函数的name值不允许修改,这里没有报错,而是直接忽略)

忽略了?没错。

在第一行加一句代码 "use strict"; 在严格模式下执行就能看到报错 :

Uncaught TypeError: Assignment to constant variable (常数变量赋值),

而这个错误在正常模式下是不会执行的,也就是静默错误,直接忽略执行。

所以打印的结果是 f a(){...}

为什么严格模式下报错,因为 Function.name 的 Writable 属性默认是不可写的。(但可通过 Object.defineProperty() 更改)

献上 MDN 文档:

Function:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/function

Function.name :

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 bug收集 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档