假设这是一个示例代码段,我们需要告诉该代码段可能的输出并为其提供解释
var name = 'Zakir'; (() => { name = 'Rahul'; return; console.log(name); function name(){ let lastName = 'Singh'; } })(); console.log(name);
让我们以幼稚的方式逐一解决这个问题
1→'Zakir'存储在变量名中
3→我们进入一个自执行的匿名函数
4→变量名称重新初始化为“ Rahul”
5→遇到return语句,所以我们退出函数
15→将名称变量打印到当前值为“ Rahul”的屏幕上
因此,最终输出将是
Rahul
但是,不幸的是,这是错误的,让我们再次遍历代码以查看出错的地方,这一次牢记了变量和函数的概念。
1→'Zakir'存储在变量名中
3→我们进入一个自执行的匿名函数
当我们进入函数时,函数将进行提升,并且将name()
在自执行函数底部定义的函数提升到自执行函数的最顶部,并且在该中间状态下,代码将类似于-
let name = 'Zakir'; (() => { let name; name = 'Rahul'; return; console.log(name); name = function(){ let lastName = 'Singh'; } })(); console.log(name);
请注意,只要将变量/函数提升到其作用域的顶部,就只会对其进行定义和初始化,并会在其实际位置对其进行初始化,而在顶部则是未定义的,但是它存在。
因此,当变量名被重新初始化时,是局部变量名被重新初始化,而不是全局变量,因此,在此之后,我们退出自执行函数,并将全局变量名打印到控制台,该控制台仍然保存着“ Zakir” 。因此,输出将是-
输出结果
Zakir