#javascript
#javascript
Вопрос:
Возможно, я неправильно формулирую этот заголовок, но в javascript можно ли вызывать вложенную функцию таким образом, если нет, то почему и какие есть более безопасные или правильные способы
function foo() {
return function poo() {
console.log("ew");
}
}
var fooPoo = foo()();
Ответ №1:
Да, это нормально и довольно нормально, если вы хотите poo
иметь доступ к конфиденциальной информации внутри foo
и не хотите, чтобы вызывающий код имел доступ к этой информации. Или даже просто if foo
— это то, что знает, как создать poo
функцию, даже если личная информация не нужна.
Относительно редко можно сделать все это в одном выражении, потому что обычно, когда вы возвращаете функцию из другой функции, вы хотите сохранить функцию:
var p = foo();
var fp1 = p();
var fp2 = p();
… но только относительно необычный, а не необычный.
Вот пример использования личной информации, хранящейся в контексте исходного вызова функции ( allocator
здесь, как у вас foo
):
function allocator(seed) {
return function() {
return seed ;
};
}
var a = allocator(1);
console.log(a()); // 1
console.log(a()); // 2
console.log(a()); // 3
Обратите внимание, что вызывающий код a
не может управлять seed
напрямую. Он может вызывать a
и использовать только возвращаемое значение.
Комментарии:
1. я вижу, что большая часть этого имеет смысл, но почему вы хотели бы сохранить его?
2. @NicholasRotondo: Это полностью зависит от того, для чего предназначена функция.
Ответ №2:
Да, это функциональный метод, называемый currying
. это позволяет вам устанавливать параметры для функции в разных местах вашего кода
function foo(param1) {
return function poo(param2) {
console.log(param1, param2);
}
}
var fooPoo = foo('param1')('param2');
Обычно я использую currying для передачи настроек при запуске прослушивателей событий, чтобы обеспечить более широкое повторное использование функций
function setColor(color) {
return function (e) {
e.target.background = color
}
}
someElement.addEventLister('click', setColor('red'))
Здесь вы можете передать свою конфигурацию при объявлении прослушивателя событий, но она не будет вызвана до тех пор, пока событие не будет запущено, и из-за закрытия у вас будет доступ к переменной color в обратном вызове прослушивателя событий. Но теперь, когда я знаю технику, я использую ее совсем немного