2015-07-25 2 views
8

Я читал через Eloquent JavaScript, когда я наткнулся на это в главе 5.:Объяснить «вы можете иметь функции, которые изменяют другие функции»

вы можете иметь функции, которые создают новые функции.

function greaterThan(n) { 
    return function(m) { return m > n; }; 
} 
var greaterThan10 = greaterThan(10); 

И у вас могут быть функции, которые изменяют другие функции.

function noisy(f) { 
    return function(arg) { 
    console.log("calling with", arg); 
    var val = f(arg); 
    console.log("called with", arg, "- got", val); 
    return val; 
    }; 
} 
noisy(Boolean)(0); 
//->calling with 0 
//->called with 0 - got false 

Мои вопросы:

  • Как вышеуказанные два примера отличаются?
  • Как noisy change Boolean?
+2

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

+1

«Изменение других функций» представляется ошибочным, даже если оно пытается «просто» использовать концепцию работы; функция одна и та же. Это было бы лучше выражено как «И у вас могут быть функции, которые * используют * (путем * wrapping *) другие функции ..» – user2864740

ответ

4

Разница в том, что аргумент noisy предназначен для другой функции, а не для «простого» значения, такого как число. Таким образом, да, он создает новую анонимную функцию, как это делает greaterThan, но это оболочка вокруг существующей функции, которая изменяет ее поведение.

В этом случае обертка только регистрирует некоторые сообщения до и после вызова исходной функции f. Но вы можете делать другие вещи, например, изменять свои аргументы или возвращаемое значение. Например, вы можете реализовать partial function application, который позволяет предоставить около аргументов для вызова функции в одной точке программы и «запомнить» эти аргументы в новой функции, которая берет только остальные аргументы позже.

+0

Трудно считать, что это правильный ответ, пока не станет ясно, что «изменение функции» находится где-то между вводящим в заблуждение и просто неправильным. –

1

Как эти два примера отличаются друг от друга?

greaterThan принимает параметр, n, который предназначен, чтобы быть числом.

noisy принимает параметр, f, который предназначен для функции, которую он может вызвать в нем.

Где greaterThan оценивает только номер, noisy является более гибким, так как он может принимать любую функцию и выполнять ее.

Как шумно изменяется логическое?

noisy возвращает анонимную функцию, которая оценивает Boolean в строке, что она сохраняет свои результаты в переменную с именем val.

+0

Таким образом, шумно * не * меняет логическое значение (или функцию, на которую он первоначально ссылался) .. – user2864740

+0

Правильно! Он не меняет его. –

+0

Итак, что это за цитата * пытается * сказать? – user2864740

Смежные вопросы