代码之家  ›  专栏  ›  技术社区  ›  Sebastian Neferu

如果返回的函数没有存储在某个地方,它会去哪里?

  •  1
  • Sebastian Neferu  · 技术社区  · 6 年前

    如果返回的函数没有存储在某个地方,它会去哪里?它不应该附加到全局对象/当前外部上下文吗? 下面是一个例子:

    var setup = function(){
        console.log("xyz");
        return function goBack(){
            console.log("It's actually abc");
        }
    }
    

    现在,在全局范围内调用setup()时,控制台中会显示“xyz”,但返回函数(即goBack)不会追加到全局范围内。

    setup() //Outputs "xyz"
    

    现在,在尝试调用goBack时,它在全局范围内未定义:

    goBack() //error: goBack not defined
    

    5 回复  |  直到 6 年前
        1
  •  4
  •   deceze    6 年前

    你在退回一张支票 函数对象

        2
  •  0
  •   BenoitVasseur    6 年前

    goBack 函数,因为词法范围: https://stackoverflow.com/a/1047491/1836175 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures .

    如果你想执行你的 戈巴克 setup() 您只需存储 setup 作用Javascript具有一流的功能: https://developer.mozilla.org/en-US/docs/Glossary/First-class_Function

    因此,稍后能够执行goBack函数的代码是:

    var later = setup()
    // do whatever you want and when needed 
    later() // -> will call the goBack function
    

    希望这有助于澄清到底发生了什么:)。

    PS:是的,如果没有存储,函数将被垃圾收集(参见deceze响应)。

        3
  •  -1
  •   Jay    6 年前

    如果不将其存储在变量中,则当 setup

    var setup = function(){
        console.log("xyz");
    
        window.goBack = function(){
            console.log("It's actually abc");
        }
    }
    

    还有 goBack 函数在全局范围内可用。

    window.goBack() 或者只是 goBack()

        4
  •  -2
  •   Zorak    6 年前

    实际上,您正在返回一个对象,该对象可以存储在变量中,然后运行,也可以直接运行它。

        function a(){
        console.log("a");
        return function b(){
        console.log("b");
        };
        }
        console.log("this is calling just a");
        a();
        console.log("this is calling the a and the returned object");
        a()();
        5
  •  -2
  •   Duncan Thacker    6 年前

    只是补充一下deceze的答案——添加到全局范围通常是一件坏事,所以除非您真的想要,否则该语言不会这样做。

    将内容保持在范围内是非常重要的,将内容存储在全局范围内是引入真正难以修复的bug的好方法。