правильный этикет вызова функции?

#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 в обратном вызове прослушивателя событий. Но теперь, когда я знаю технику, я использую ее совсем немного