在Javascript函数中返回值

时间:2015-12-18 16:42:40

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

我在了解@Jacob Swartwood https://stackoverflow.com/a/6472397/3179569

的闭包时遇到了这个答案

我无法理解littleGirl如何将故事称为故事,就好像它是一个功能一样。不应该是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();

3 个答案:

答案 0 :(得分:4)

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

首先,返回princess的函数undefined

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中的访问修饰符一样)。

所以,最后,一个函数返回一个带有函数的对象文字,其中的函数关闭了一个私有数组:

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

princess().story();

//> 3

答案 1 :(得分:2)

要扩展@asantaballa所说的内容,story是一个值为function () {...}的密钥。如果您要运行console.log(littleGirl.story),则会看到function princess/<.story()

公主可以像这样改写......

function princess() {


    var adventures = [];

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

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

    var getAdventure = function () {
        return adventures[adventures.length - 1];
    };

    var retObj = new Object(); // same as '{}'
    retObj.story = getAdventure;

    return retObj;
}


var littleGirl = princess();

littleGirl.story();

答案 2 :(得分:1)

或者换句话说,公主只是一种功能。

你用princess()调用它并返回一些东西。

它返回的是一个像这样的对象:

{
    story:function() {...}
}

这个对象里面有一个函数(故事)。

功能毕竟只是一些可以传递的数据,并像其他数据一样分配给变量。

对象是一种将不同数据组合在一起的方法..井..,对象

因此您可以将函数放在对象中。函数可以返回任何数据类型,包括对象。

// set variable aFunc to some function
var aFunc=function() {...}

// call it
aFunc();

// Set an object
var anObj= {
    anInt:3,
    aString:"blabla",
    itsFunction:aFunc
}

调用其中的函数

anObj.itsFunction();

返回同一对象的函数是

function getAnObj() {
    return {
        anInt:3,
        aString:"blabla",
        itsFunction:aFunc
    }
}

在我们的例子中,公主就像getAnObj, 故事就像一个功能

所以

princess().story();

就像

var anObj=getAnObj();
anObj.itsFunction();

函数(princess)返回一个对象(littleGirl),其中包含一个函数(story)。你打电话给它。

函数(getAnObj)返回一个对象(anObj),其中包含一个函数(itsFunction)。你打电话给它。

姓名..