JavaScript每日一题_立即执行函数中函数名和变量同名,输出的是什么

立即执行函数中函数名和变量同名,输出的是什么
代码如下

	var a = 1;
	(function a() {
	   a = 2
	   console.log(a)
	})();

首先,不是输出2,也不是输出1

运行代码
在这里插入图片描述
输出的是函数a未定义

一句一句代码解读
实现

	var a = 1;

会在window对象上挂载一个属性a,并赋值为1

然后是

	(function a() {
	   a = 2
	   console.log(a)
	})();

立即调用函数会生成一个闭包环境
在局部作用域中有一个函数a声明和a赋值
按照正常情况
函数a声明和赋值会被提升,此时a的值为函数
当运行到a=2时
a被赋值为2
此时打印console.log(a)的值为2
但是

在立即执行函数中函数的变量名是只读的,也就是说a=2这叫代码是不合法的,不会被执行

证明一下,
如下,在立即执行函数中进入严格模式
在这里插入图片描述

如上图,typeError错误,给常量赋值
也就是说在立即执行函数中函数a是常量,不能再重新赋值,这也就是为什么最后a打印为函数