javascript - 此回调引用了取消引用的闭包吗?

标签 javascript callback closures

我一直在处理多段代码中的问题,但它似乎归结为我在这个演示中展示的内容。我认为这与闭包的取消引用有关:

function get_5(callback) {
    var result = 5;
    callback(result);
}

function get_self(x) {
    return x;
}

get_5(console.log);
// 5

console.log(get_self(5));
// 5

在第一个结果中,第一个函数按预期运行,将其隐藏变量发送到 console.log 函数的输入中。

第二个结果也有意义,因为它实际上只是证明了第二个函数的工作原理:它接受输入的内容并返回它。

但是当我尝试组合这两个函数时,事情变得很奇怪:

var a = get_5(get_self);

console.log(a);
// Undefined!

这第三个结果是未定义的,很奇怪,我不知道为什么。闭包是否被取消引用,可能是由于 get_self 函数的“鬼鬼祟祟”?我怎样才能解决这个问题?作为奖励,是否有一种方法可以完全消除 get_self 函数,并能够直接读取未修改的变量 result,而不指定任何特定的回调?

最佳答案

get_5 没有 return 语句。无论您传递给 get_5 的内容是什么,它总是返回 undefined

Perl 将返回子程序中最后一条语句的计算结果,但 JavaScript 不会。

如果您希望 get_5 返回调用您传递给它的回调的结果,那么您必须明确说明:

function get_5(callback) {
    var result = 5;
    return callback(result);
}

关于javascript - 此回调引用了取消引用的闭包吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44776004/

相关文章:

javascript - 打破 JavaScript 中的依赖关系

events - NSTextView 值已更改

javascript - 这是 Closure 的正确陈述吗?

swift - swift 3 中的回调语法

javascript - JS 闭包和执行上下文的创建

javascript - Jquery切换: closing a toggle element

javascript - Typescript 将两种数据类型数组合并为一个

javascript - D3 将文本附加到内圆

android - 如何检测谷歌地图服务上的 moveCamera 完成?

jsf - 从 quartz 作业调用应用程序范围的 bean 中的方法