Как (например, в каком порядке) выполняется этот код и что он делает?

Я нашел этот сумасшедший код javascript.

Может кто-то уточнить точные шаги, которые этот код проходит и почему?

(function a(a){
    return a;
})
(function b(b){
    return b;
})
(function c(c){
    return c;
})
(true);

Ответ 1

  • Это будет self-invoke a, которому присваивается function b как аргумент (поскольку a определяется как переменная внутри a локальной области видимости, которая будет присутствовать над функцией a, которая является объявлен в родительской области.).
  • Затем он будет вызывать self b, который задан c как аргумент.
  • Наконец, функция c вызывается самозапускаемой, которая возвращает true, как это указано в качестве аргумента.

Вы можете посмотреть на это как на цепочку:

a(var a)    // function b given as arg. When a returns b() will be invoked
   b(var b) // function c given as arg. When b returns c() will be invoked
      c(true)

a, когда внутри функции (локальная область) есть переменная, потому что function foo(bar){} совпадает с function(){var bar = arguments[0]}.

Функция a может быть написана так же и делать то же самое:

function a(foo){
    return foo;
}

Вы можете проверить это:

console.log('start');

(function a(a){
    console.log('a', typeof a);
    return a;
})
(function b(b){
    console.log('b', typeof b);
    return b;
})
(function c(c){
    console.log('c', typeof c);
    return c;
})
(true);

console.log('end');

ОН-ЛАЙН FIDDLE ЗДЕСЬ

Консольный вывод (обновленный, чтобы показывать в FF, а также , чтобы использовать выход для определения функции):

> start
> a function
> b function
> c boolean
> end

Ответ 2

Чтобы понять, что происходит, упростите его:

(function a(d){
    return 5*d;
})
(2)

Вышеприведенный код, запускаемый в консоли, выведет 10. То, что происходит в скобках, говорит, что код запускается немедленно (он называется функцией самозапускания), принимая все, что следует за параметром. Поэтому я создаю function a и сразу же запускаю его с 2 в качестве параметра.

Код, который у вас есть, в основном то же самое, но с большим количеством уровней и без умножения. Все ваши функции просто возвращают свои параметры, а тот, который передается, является логическим true, поэтому код будет выводить true в конце.

Ответ 3

Это возвращает true.

Определено первое function a (неправильное имя?), которое принимает аргумент и возвращает его. Эта функция вызывается немедленно, с аргументом, возвращающим значение (function b(b){ return b; })(function c(c){ return c; })(true). Которая получает оценку до вызова a.

(function b(b){ return b; })(function c(c){ return c; })(true) - это аналогичная конструкция с определенной функцией b, которая возвращает аргумент, который она получает, и снова вызывается сразу с аналогичным аргументом и тем же для третьей функции c.

Ответ 4

Функции выполняются в порядке сверху вниз. Вы можете вызвать функцию с другой функцией в качестве аргумента. Это отлично. Он продолжает делать это до тех пор, пока "истина" не будет передана в качестве аргумента, и в этом случае вызывающая цепочка вернет "истину".

(function a(a){       // Function a is called with function b as an argument.
    console.log('a'); // The console.log statement is executed,
    return a;         // Then function a returns b 
})                    

(function b(b){       // Function b is called with function c as an argument.
    console.log('b')  // The console.log statement is executed
    return b;         // And then function b returns c 
})

(function c(c){       // Function c is called with "true" as an argument
    console.log('c')  // The console.log statement is executed
    return c;         // And then function c returns true.
})

(true); 

Ответ 5

(function a(a){
            alert(a);
        return a;
    })
    (function b(b){
        alert(b);
        return b;
    })
    (function c(c){
        alert(c);
        return c;
    })
    (true);

Просто верните следующую часть параметра с символом().

Ответ 6

Я возьму на него удар.

(function a(a){
  return a;
})
(function b(b){
 return b;
})
(function c(c){
return c;
})
(true);

Это все самозапускаемые функции.

Но последний:

    (function c(c){
      return c;
    })
    (true);

Получает значение true, переданное в. Таким образом, когда он возвращает "c" - вы становитесь истинным.

Для остальных он просто перемещается, когда анонимные функции передаются в возвращаемом значением функцией. Итак, визуальный.

   (function a(a){   <-- the return of b, gets passed in here
      return a;
    })(function b(b){return b;}) <-- the return of c, gets passed in here

    (function c(c){return c;})(true);  <--- true gets passed into c.