JavaScript 自执行匿名函数中这个问题是什么?
假设这里有一段示例代码,我们需要说明这段代码可能的输出并解释原因。
var name = 'Zakir'; (() => { name = 'Rahul'; return; console.log(name); function name(){ let lastName = 'Singh'; } })(); console.log(name);
让我们用一种简单的方法逐行分析这个问题。
1 → ‘Zakir’ 存储在变量 name 中。
3 → 我们进入一个自执行匿名函数。
4 → 变量 name 被重新初始化为 ‘Rahul’。
5 → 遇到 return 语句,所以我们退出函数。
15 → 将 name 变量(当前值为 ‘Rahul’)打印到屏幕。
所以,最终输出将是
Rahul
但是,不幸的是,这是错误的。让我们再次仔细检查代码,这次要记住变量和函数提升的概念。
1 → ‘Zakir’ 存储在变量 name 中。
3 → 我们进入一个自执行匿名函数。
当我们进入函数时,函数提升生效,在自执行函数底部定义的函数 name() 被提升到自执行函数的顶部。在这个中间状态,代码将类似于:
示例
let name = 'Zakir'; (() => { let name; name = 'Rahul'; return; console.log(name); name = function(){ let lastName = 'Singh'; } })(); console.log(name);
请注意,每当变量/函数被提升到其作用域的顶部时,它只会被定义和初始化,它在其实际位置被初始化,在顶部它是未定义的,但它存在。
因此,当变量 name 被重新初始化时,是局部变量 name 被重新初始化,而不是全局变量。之后,我们从自执行函数返回,并将全局变量 name 打印到控制台,该变量仍然保存 ‘Zakir’。因此,输出将是:
输出
Zakir
广告