2013-07-11 6 views
2

Работа через 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) следует рассматривать в качестве параметра для внутренней функции?

+0

Функции JavaScript образуют замыкание по области переменных, где они были изначально определены. Функция 'doMysteriousThing' была создана в области переменных, в которой передан' makerValue'. Это дает этой функции возможность ссылаться на 'makerValue', даже если функция возвращается и назначается вашей' mysteryFunction3'. Как вы можете видеть, он использует его в возвращаемом значении 'return makerValue + param;' где 'makerValue' снова был передан' makeMysteryFunction() ', а' param' передан 'doMysteriousThing()' –

+2

Это может быть меньше путают, если у вас не было 3 разных имени для одной и той же функции. Функции 'newFunction',' doMysteriousThing' и 'mysteryFunction3' относятся к одной и той же функции. Чтобы очистить его, я бы избавился от имен 'newFunction' и' doMysteriousThing' и просто выполнил функцию return (param) {return makerValue + param; }; ' –

ответ

0

Оба ответы очень полезны, но изо всех сил через это сам, я думаю, что лучший ответ просто пройти через то, что происходит, и изменить его достаточно, чтобы пролить новый свет на него:

makeMysteryFunction делает функцию который добавляет свой аргумент (makerValue) к аргументу, который передается возвращаемой функции (mysteryFunctionX).

Итак, что помогли мне понять это преобразование числа в строку:

function makeGreeting(greeting) 
{ 
    var newFunction = function greet(name) 
    { 
    return greeting + ' ' + name; 
    }; 
    return newFunction; 
} 

var makeGreetingHi = makeGreeting('Hi'); 
var makeGreetingHello = makeGreeting('Hello'); 
//finally call functions 
makeGreetingHi('Stranger'); 
//Hi Stranger 
makeGreetingHello('Friend'); 
//Hello Friend 

Все, что я сделал, было изменить название функции, и конкатенации строк вместо добавления номера. То, что делает koan путаным, - это имена функций: предположим, что это хороший пример плохой практики. Пункт упражнения просто состоит в том, что в примере, который я предоставил, функция greet имеет доступ к greeting. К сожалению, это потеряно в номенклатуре