H5W3
当前位置:H5W3 > 其他技术问题 > 正文

如何理解这个自执行函数?他们是怎么执行的?

 例1:
var fn = 2;
(function fn(){
fn = 23
console.log(fn) //fn()
})()
---------------
例2:
(function fn(){
fn = 23
})()
console.log(fn) // 报错
---------------
例3:
(function fnx(){
fn = 23
})()
console.log(fn) // 23

例2中函数内部对fn的赋值为什么没向上层查找然后在全局赋值个fn变量呢?

回答

搜索到了一些解释:
具名自执行函数的变量是可读属性,无法修改
例2可以这样解释:
fn函数执行的时候在函数内部有个fn的赋值,在函数内部查询是否有fn这个变量,找到了这个具名的fn函数(到这一步已经找到了,就不会再继续往外层找了,就是说不会再在window上定义fn变量了),但是这个fn的值是无法修改的,所以最终fn还是这个函数
参考

(function fn(){
   fn = 23;
   console.log(fn);  // ƒ fn(){...}
 })();

确实向上找了,确实也找到了,找到的就是函数 fn,不过修改 fn 值没有成功,这倒是触及了我的知识盲区。

虽然比较奇怪,但是自执行函数为什么要写函数名?用匿名不香吗?
0.全局作用域
1.当前作用域(可能 = 0)
2.自执行函数作用域
3.函数内部作用域
变量提升从 3 -> 2 之后
当前作用域的变量由于 fn 同名类似以下效果,作用域提升不能
全局变量的 2 继续提升

(
    function (){
        console.log(1)
        var fn = 2
    }()
)
console.log(fn)
// 1
// VM62664:7 Uncaught ReferenceError: fn is not defined

本文地址:H5W3 » 如何理解这个自执行函数?他们是怎么执行的?

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址