Чи можете ви писати вкладені функції в JavaScript?


116

Мені цікаво, чи підтримує JavaScript написання функції в іншій функції, або вкладені функції (я читаю її в блозі). Це реально можливо ?. Насправді я їх використав, але не впевнений у цій концепції. Мені це дійсно незрозуміло - будь ласка, допоможіть!

Відповіді:


197

Чи справді це можливо.

Так.

function a(x) {    // <-- function
  function b(y) { // <-- inner function
    return x + y; // <-- use variables from outer scope
  }
  return b;       // <-- you can even return a function.
}
console.log(a(3)(4));


23
Цей метод називається каррінг.
Єквер

цей код еквівалентний цьому?
Енн Ортіз

функція a (x) {// <- повернення функції {calc: функція (y) {// <- повернення внутрішньої функції x * y; // <- повернення x використання змінних із зовнішньої області}}; console.log (a (3) (4));
Енн Ортіз

29

Далі - противно, але служить для демонстрації того, як ви можете ставитися до функцій, як до будь-якого іншого виду об’єктів.

var foo = function () { alert('default function'); }

function pickAFunction(a_or_b) {
    var funcs = {
        a: function () {
            alert('a');
        },
        b: function () {
            alert('b');
        }
    };
    foo = funcs[a_or_b];
}

foo();
pickAFunction('a');
foo();
pickAFunction('b');
foo();

4
Чудовий приклад. Я хочу додати, що важливо зазначити, що функції, визначені в інших функціях, існують лише в межах цих функцій (якщо, звичайно, ви не призначите глобальну функцію для цього, як показано в цьому прикладі).
Майк Шеров

5
Ставтесь до цих функцій як до об'єктів, які вони є
Алекс Ломія

17

Функції - це об'єкти першого класу, якими можуть бути:

  • Визначено у межах вашої функції
  • Створено так само, як і будь-яка інша змінна або об'єкт у будь-якій точці вашої функції
  • Повернувся зі своєї функції (що може здатися очевидним після двох вищезгаданих, але все ж)

Щоб побудувати на прикладі Кенні:

   function a(x) {
      var w = function b(y) {
        return x + y;
      }
      return w;
   };

   var returnedFunction = a(3);
   alert(returnedFunction(2));

Попереджав би вас 5.


5
Цей метод називається каррінг.
Єквер

14

Так, можна записати та викликати функцію, вкладену в іншу функцію.

Спробуйте це:

function A(){
   B(); //call should be B();
   function B(){

   }
}

11

Ви не тільки можете повернути функцію, яку ви перейшли в іншу функцію як змінну, ви також можете використовувати її для обчислення всередині, але визначивши її зовні. Дивіться цей приклад:

    function calculate(a,b,fn) {
      var c = a * 3 + b + fn(a,b);
      return  c;
    }

    function sum(a,b) {
      return a+b;
    }

    function product(a,b) {
      return a*b;
    }

    document.write(calculate (10,20,sum)); //80
    document.write(calculate (10,20,product)); //250

1
Я використовую це з ajax
jscripter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.