【问题标题】:Is This Callback Referencing a Dereferenced Closure?此回调是否引用了取消引用的闭包?
【发布时间】:2017-06-27 08:52:44
【问题描述】:

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

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,它没有被修改,而不指定任何特定的回调?

【问题讨论】:

    标签: javascript callback closures


    【解决方案1】:

    get_5 没有return 语句。传递给get_5 的内容无关紧要,它总是返回undefined

    Perl 将返回对 sub 中最后一条语句的求值结果,但 JavaScript 不会。

    如果你想让get_5返回调用你传递给它的回调的结果,那么你必须明确地说出来:

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

    【讨论】:

    • 很好,感谢您的快速响应。但是为什么我的示例中的第一个结果会返回值——在这种情况下发生了什么不同,从而使其“工作”?
    • get_self 确实返回一个值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2023-03-20
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2017-07-18
    相关资源
    最近更新 更多