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而不使用调用的结果时,结果会出现在哪里吗?。。。事实上,它有一个名称对调用环境没有任何影响…即使,它会在设置内创建一个符号,而不是在设置外创建一个符号。。。。但值得一提的是,给出一个名字会使调试有更好的异常消息。如果能得到一些反馈,说明为什么这个答案被否决,那会很好——我想提问者可能会发现它有用吗?