Работа через Javascript Коаны, я получаю повесил трубку на следующий код:лексические параметры Scoping в JavaScript
it("should use lexical scoping to synthesise functions", function() {
function makeMysteryFunction(makerValue)
{
var newFunction = function doMysteriousThing(param)
{
return makerValue + param;
};
return newFunction;
}
var mysteryFunction3 = makeMysteryFunction(3);
var mysteryFunction5 = makeMysteryFunction(5);
expect(mysteryFunction3(10) + mysteryFunction5(5)).toBe(FILL_ME_IN);
});
Он получает 23, и это нормально. Я озадачен тем, как/почему параметр, присвоенный переменной «mysteryFunction3», передается функции doMysteriousThing как «param».
Это просто факт жизни, что если есть внутренняя и внешняя функция которой каждый берет один параметр, определяющий переменную равной внешней функции, заданной заданный параметр, как:
var mysteryFunction3 = makeMysterFunction(3);
сделает его так что отправка параметра переменной экземпляра внешней функции, как:
mysteryFunction3(10)
приведет к тому, что параметр (10) следует рассматривать в качестве параметра для внутренней функции?
Функции JavaScript образуют замыкание по области переменных, где они были изначально определены. Функция 'doMysteriousThing' была создана в области переменных, в которой передан' makerValue'. Это дает этой функции возможность ссылаться на 'makerValue', даже если функция возвращается и назначается вашей' mysteryFunction3'. Как вы можете видеть, он использует его в возвращаемом значении 'return makerValue + param;' где 'makerValue' снова был передан' makeMysteryFunction() ', а' param' передан 'doMysteriousThing()' –
Это может быть меньше путают, если у вас не было 3 разных имени для одной и той же функции. Функции 'newFunction',' doMysteriousThing' и 'mysteryFunction3' относятся к одной и той же функции. Чтобы очистить его, я бы избавился от имен 'newFunction' и' doMysteriousThing' и просто выполнил функцию return (param) {return makerValue + param; }; ' –