Я наткнулся на этот ответ, когда понимал замыкания @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();
2
rgb_jewel 18 Дек 2015 в 19:42

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
4
Davin Tryon 18 Дек 2015 в 17:04

Чтобы расширить то, что сказал @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
Marie 18 Дек 2015 в 16:58

Или по-другому, принцесса это просто функция.

Вы вызываете его с помощью 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). И ты называешь это.

Имена ..

1
FrancescoMM 5 Янв 2016 в 18:00