Javascript 函数中的返回值

Returning Values in Javascript Functions

我在理解@Jacob Swartwood 的闭包时遇到了这个答案

而且我无法理解 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();

为了扩展@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();

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

首先,一个函数 princess 即 returns undefined:

function princess() {
}

princess();

//> undefined

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

function princess() {
    return {};
}

princess();

//> Object {}

接下来,一个函数 returns 一个对象文字,里面有一个函数(returns undefined):

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

princess().story();

//> undefined

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

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

princess().story();

//> Array []

我认为这涵盖了您的 大部分 观点。但是,none 其中与闭包有很大关系。在您的示例中,数组 adventures 是要关闭的内容。这允许某种 private 成员(就像 Java 中的访问修饰符)。

所以,最后,一个函数 returns 一个对象字面量,里面有一个函数关闭 private 数组:

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

princess().story();

//> 3

或者换句话说,公主只是一个函数。

你用 princess() 调用它,它 return 有点意思。

它 return 的东西是这样的对象:

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

这个对象里面有一个功能(故事)。

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

一个对象是一种将不同数据组合成一个单一的..嗯..对象

的方法

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

// 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();

return使用同一对象的函数是

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

在我们的例子中,princess 就像 getAnObj, 故事就像一个函数

所以

princess().story();

就像

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

一个函数 (princess) returned 一个对象 (littleGirl),其中有一个函数 (story)。你叫它。

一个函数 (getAnObj) returned 一个对象 (anObj),其中有一个函数 (itsFunction)。你叫它。

姓名..