Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果返回的函数没有存储在某个地方,它会去哪里?_Javascript_Function_Variables_Scope_Return - Fatal编程技术网

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

Javascript 如果返回的函数没有存储在某个地方,它会去哪里?,javascript,function,variables,scope,return,Javascript,Function,Variables,Scope,Return,如果返回的函数没有存储在某个地方,它会去哪里?它不应该附加到全局对象/当前外部上下文吗? 下面是一个例子: var setup = function(){ console.log("xyz"); return function goBack(){ console.log("It's actually abc"); } } 现在,在全局范围内调用setup时,xyz显示在控制台中,但是返回函数,即goBack没有附加在全局范围内 setup() //Out

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

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。但是,在执行安装程序后,我是否应该能够从全局范围访问goBack?因为如果我将安装程序存储到一个全局变量中,我就可以通过该变量访问goBack。但是如果我不使用变量来存储安装程序返回的函数,会发生什么呢?戈巴克到底回哪里去了?谢谢。

您返回的是一个函数对象,它与任何其他类型的对象或任何其他类型的值相同。如果您不将其分配给任何对象,它就会超出范围并被垃圾收集。它不会发生任何变化。

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

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

    window.goBack = function(){
        console.log("It's actually abc");
    }
}
并在全局范围内提供goBack函数

setup() //Outputs "xyz"

然后您可以通过window.goBack或goBack访问它实际上,您正在返回一个对象,该对象可以存储在一个变量中然后运行,也可以直接运行它

功能a{ console.loga; 返回函数b{ console.logb; }; } console.log这只是调用一个; A. console.logthis调用a和返回的对象;
a 只是补充一下deceze的答案——添加到全局范围通常是一件坏事,所以除非您真的想要,否则该语言不会这样做

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


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

我想说,您无法执行goBackfunction,因为词法范围:而不是闭包:

如果您想执行goback函数,因为它是由安装程序返回的,那么只需存储安装程序函数的返回。Javascript具有一流的功能:

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

var later = setup()
// do whatever you want and when needed 
later() // -> will call the goBack function
希望这有助于澄清到底发生了什么


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

我是否应该能够从全局范围访问goBack?您为什么这么认为?否,当你给一个函数起这样的名字时,这个名字不会自动变成一个符号,而是在函数本身的任何地方。你知道当你返回{}或返回1而不使用调用的结果时,结果会出现在哪里吗?。。。事实上,它有一个名称对调用环境没有任何影响…即使,它会在设置内创建一个符号,而不是在设置外创建一个符号。。。。但值得一提的是,给出一个名字会使调试有更好的异常消息。如果能得到一些反馈,说明为什么这个答案被否决,那会很好——我想提问者可能会发现它有用吗?