Я наткнулся на этот ответ, когда понимал замыкания @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 ответа
Возможно, если мы разберем это и добавим одну вещь за раз, это будет иметь больше смысла.
Во-первых, функция 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).
Итак, наконец, функция, которая возвращает литерал объекта с функцией внутри, которая закрывается над массивом private :
function princess() {
var myArray = [1, 2, 3];
return {
story: function {
return myArray[myArray.length - 1]; // get the last one: 3
}
};
}
princess().story();
//> 3
Чтобы расширить то, что сказал @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 (), и он что-то возвращает.
То, что он возвращает, это объект, подобный этому:
{
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
). И ты называешь это.
Имена ..
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.