此回调是否引用了解除引用的关闭?

时间:2017-06-27 08:52:45

标签: 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,而不指定任何特定的回调?

1 个答案:

答案 0 :(得分:4)

get_5没有return声明。传递给get_5的内容并不重要,总是返回undefined

Perl将返回评估sub中最后一个语句的结果,但JavaScript不会。

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

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