2014-12-17 2 views
0

Я делаю учебные пособия для функционального программирования на nodeschool-homepage. Я новичок в JS (пришли из Java), поэтому я не получаю некоторые аспекты JS, например:Функция JavaScript, которая возвращает функцию с параметрами

function say(word) { 
    return function(anotherWord) { 
     console.log(anotherWord); 
    } 
} 

Если я называю:

say("hi"); // it returns nothing 

say("hi", "hi"); // it returns nothing 

var said = say("hi"); // asignment 

said("hi"); // returns hi -- but why? 

said(); // returns undefined; 

Может кто-нибудь объяснить мне, как «hi» во внешней функции передается во внутренней функции?

ответ

0

Функция say принимает один параметр word, который не используется в любом месте, так что ничего не передается от функции «внешнего» к «внутренней» функции.

function say(word) { 
    return function(anotherWord) { 
     console.log(anotherWord); 
    }; 
} 

Что происходит, что say() возвращает функцию. Эта возвращаемая функция принимает один параметр (anotherWord), который выводится на консоль при вызове.

Теперь ваши образцы кода:

say("hi"); // this returns a function, but you don't keep it anywhere 

say("hi", "hi"); // still returns a function, still no variable to keep it 

var said = say("hi"); // finally the returned function is saved, the param is not used 

said("hi"); // this prints "hi", because you pass it 'hi' 

said("foobar"); // this prints "foobar", because you pass it 'foobar' 

said(); // This prints undefined, as you did not pass any parameter 
2
said("hi"); // returns hi -- but why? 

Поскольку внутренняя функция определяется как

function(anotherWord) { 
    console.log(anotherWord); 
} 

Это означает, что он входит в первый аргумент, который пропускается. Вы проходите 'hi', поэтому он регистрирует 'hi'.

как t .. f ... «hi» во внешней функции передается во внутренней функции?

Это не так. Внутренняя функция только обращается к своему собственному аргументу. Неважно, что вы передаете как аргумент первой функции. say()('hi'), say('foo')('hi') все эквиваленты. Важно то, что аргумент передан второй функции.

Если вместо того, чтобы вы определили функцию

function say(word) { 
    return function(anotherWord) { 
     console.log(word, anotherWord); 
    } 
} 

Теперь внутренняя функция также обращается первый аргумент внешней функции, так что вы получите разные результаты.

Почему это работает? Поскольку все функции в JS равны closures, и поэтому они имеют доступ к переменным связям в более высоких областях.

0

Функция say возвращает функцию, которая принимает параметр и регистрирует его. Параметр, переданный функции say (параметр word), отбрасывается.

Экземпляр кода, который появляется на работе не является следующее:

var said = say("hi"); 
said("hi"); 

При вызове say функция в первой строке здесь, слово «привет», что вы передаете ничего не делает. Эта функция возвращает другую анонимную функцию, которая хранится в переменной said.

Когда вы вызываете функцию в переменной said и переходите в «привет», она работает как ожидалось. Она будет работать точно так же, если первая линия была

var said = say("elephant"); 
Смежные вопросы