闭包问题,函数名称。

 let fn = function () {
            let number = 0;

            return function () {
                number++;

                console.log(number);
            };
        };

        let increment = fn();

        fn()()
        fn()()
        fn()()


        increment();
        increment();
        increment();

        console.log(increment() === fn()());

打印结果如下image.png

为什么increment()和fn()()输出结果不一样鸭。

阅读 1.4k
2 个回答

很简单
你的三行 fn()() 是每次都会执行 fn() 从而每次都在返回一个新的函数对象然后执行
increment = fn() 执行之后, increment 变量作为单次的 fn() 的返回值,你后面的每次调用都是在访问同一个函数对象

当某个函数被调用时,js 引擎会创建一个执行环境(或者叫执行上下文)及其作用域链,作用域链由当前执行环境的变量对象与上层环境的一系列活动对象组成。

每次执行 fn()都会创建一个变量对象,变量对象包含变量number和一个匿名函数。

因此执行fn()(),变量number都会被初始化。

increment 是匿名函数实例的引用,该匿名函数的作用域链包含fn()的活动对象,fn()执行完,其活动对象不会被销毁。

执行increment(),在匿名函数的作用域链中可以找到变量 number,且保留着 number的状态值。

最后一个不太清楚你的困惑是什么。函数中如果没有 return语句,其默认返回undefined

increment() === fn()() // true, 这个例子中匿名函数没有返回值,因此比较的是 undefined === undefined
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题