Можете ли вы писать вложенные функции на JavaScript?


115

Мне интересно, поддерживает ли JavaScript запись функции внутри другой функции или вложенные функции (я читал об этом в блоге). Возможно ли это? Фактически, я использовал их, но не уверен в этой концепции. Я действительно не понимаю, пожалуйста, помогите!

Ответы:


196

Это действительно возможно.

Да.

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
Этот метод называется каррированием.
Yekver

этот код эквивалентен этому?
Анн Ортис,

function a (x) {// <- функция return {calc: function (y) {// <- внутренняя функция return x * y; // <- возврат x использовать переменные из внешней области}}; console.log (а (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
Относитесь к этим функциям как к объектам, которые они есть
Alex Lomia

17

Функции - это объекты первого класса, которые могут быть:

  • Определено в вашей функции
  • Создается так же, как любая другая переменная или объект в любой момент вашей функции.
  • Возвращено из вашей функции (что может показаться очевидным после двух вышеупомянутых, но все же)

Основываясь на примере, приведенном Кенни:

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

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

Предупреждает вас с помощью 5.


5
Этот метод называется каррированием.
Yekver

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.