繁体   English   中英

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

[英]Where does a returned function go if not stored somewhere?

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

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

现在,我可以使用setUp()()或将setup()返回的函数存储到全局变量中来访问goBack。 但是,执行setup()后,我是否应该能够从全局范围访问goBack? 因为如果我将setup()存储到全局变量中,则可以通过该变量访问goBack。 但是,如果我不使用变量存储setup()返回的函数怎么办? goBack到底返回哪里? 谢谢。

您将返回一个函数对象 ,该对象与任何其他类型的对象或任何其他类型的值相同。 如果您不将其分配给任何对象,则它只会超出范围并会被垃圾回收。 它什么也没有发生。

我要说的是,由于词法范围,您无法执行goBack函数: https : goBack不是闭包: https : //developer.mozilla.org/zh-CN/docs/Web / JavaScript / Closures

如果您要执行goBack函数,因为它是由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响应)。

如果不将其存储在变量中,则将在setup函数返回时将其垃圾回收,并且您将无法再访问它。 另一方面,您可以这样编写设置函数:

var setup = function(){
    console.log("xyz");

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

并在全局范围内提供goBack函数。

那么您可以通过window.goBack()或只是goBack()访问它

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

  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()(); 

只是增加deceze的答案-添加到全局范围通常是一件坏事,因此除非您确实想要,否则该语言不会这样做。

一个示例-假设您有一个带有大量组件位的大型应用程序,并且其中许多组件位在调用时都返回一个函数。 现在,您必须确保每个组件的功能都使用不同的名称,否则最终可能会覆盖其他人的全局变量,这很不好。 而且,如果您使用的是JavaScript库,则需要确保未使用与库相同的名称,因为这样可能会破坏它们的代码。

将内容保持在范围内非常重要,而将内容存储在全局范围中是引入确实很难修复的错误的好方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM