立即执行函数中函数名和变量同名,输出的是什么
代码如下
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打印为函数