我在了解@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();
答案 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
)。你打电话给它。
姓名..