今天和大家分享一道面试题
var a = 1;
(function a() {
a = 2;
console.log(a);
})();先思考!
先思考!
先思考!
先思考!
结果为?
// 输出结果为函数 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