javascript - 在 Javascript 函数中返回值

标签 javascript functional-programming closures higher-order-functions

我在理解@Jacob Swartwood 的闭包时遇到了这个答案 https://stackoverflow.com/a/6472397/3179569

而且我不明白 littleGirl 是如何调用 story 的,就好像它是一个函数一样。不应该是 littleGirl(); 以便调用 princess 函数吗?公主函数不是返回一个键值对吗,这意味着它正在返回一个对象?那么 littleGirl 如何像访问一个函数一样访问一个键呢? (因为 story 是关键,对吧?)

我尝试在 javascript 中搜索返回键值对的术语,但没有找到合适的解释。我希望这里有人可以帮助我。我有 Java 和 C++ 的背景,所以这有点令人困惑。

function princess() {


    var adventures = [];

    function princeCharming() { /* ... */ }

    var unicorn = { /* ... */ },
        dragons = [ /* ... */ ],
        squirrel = "Hello!";


    return {


        story: function() {
            return adventures[adventures.length - 1];
        }
    };
}


var littleGirl = princess();

littleGirl.story();

最佳答案

也许如果我们将其分解并一次添加一件事,它会更有意义。

首先,返回undefined的函数princess:

function princess() {
}

princess();

//> undefined

接下来,一个返回对象字面量的函数:

function princess() {
    return {};
}

princess();

//> Object {}

接下来,一个返回对象文字的函数,其中包含一个函数(返回 undefined):

function princess() {
    return {
        story: function {}
    };
}

princess().story();

//> undefined

接下来,一个返回对象字面量的函数,里面有一个返回数组的函数:

function princess() {
    return {
        story: function {
            return [];
        }
    };
}

princess().story();

//> Array []

我认为这涵盖了您的大部分观点。然而,这一切都与闭包无关。在您的示例中,数组 adventures 是正在关闭的内容。这允许某种类型的 private 成员(类似于 Java 中的访问修饰符)。

所以,最后,一个函数返回一个对象字面量,其中一个函数在一个私有(private)数组上关闭:

function princess() {
    var myArray = [1, 2, 3];
    return {
        story: function {
            return myArray[myArray.length - 1];  // get the last one: 3
        }
    };
}

princess().story();

//> 3

关于javascript - 在 Javascript 函数中返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34360200/

相关文章:

javascript - 我通过js创建div,但它没有出现在我的页面上

javascript - 搜索期间的动态结果计数器

javascript - 如何在对象数组上调用 reduce 来总结它们的属性?

ios - 在 swift 中使用 Objective-C block

javascript - 不在 html5 Canvas 中显示图像(javascript)

javascript - 传递大对象作为参数

javascript - Meteor.js 使用 X509 证书身份验证连接到 Mongo

haskell - 什么是单子(monad)?

javascript - 是否有 ramda 函数可以帮助您将日志记录添加到管道/组合中?

ios - Swift PHP post请求从任务中设置全局变量