Я нашел этот сумасшедший код javascript.
Может кто-то уточнить точные шаги, которые этот код проходит и почему?
(function a(a){
return a;
})
(function b(b){
return b;
})
(function c(c){
return c;
})
(true);
Я нашел этот сумасшедший код javascript.
Может кто-то уточнить точные шаги, которые этот код проходит и почему?
(function a(a){
return a;
})
(function b(b){
return b;
})
(function c(c){
return c;
})
(true);
a
, которому присваивается function
b
как аргумент (поскольку a
определяется как переменная внутри a
локальной области видимости, которая будет присутствовать над функцией a
, которая является объявлен в родительской области.).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');
Консольный вывод (обновленный, чтобы показывать в FF, а также , чтобы использовать выход для определения функции):
> start
> a function
> b function
> c boolean
> end
Чтобы понять, что происходит, упростите его:
(function a(d){
return 5*d;
})
(2)
Вышеприведенный код, запускаемый в консоли, выведет 10
. То, что происходит в скобках, говорит, что код запускается немедленно (он называется функцией самозапускания), принимая все, что следует за параметром. Поэтому я создаю function a
и сразу же запускаю его с 2
в качестве параметра.
Код, который у вас есть, в основном то же самое, но с большим количеством уровней и без умножения. Все ваши функции просто возвращают свои параметры, а тот, который передается, является логическим true
, поэтому код будет выводить true
в конце.
Это возвращает 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
.
Функции выполняются в порядке сверху вниз. Вы можете вызвать функцию с другой функцией в качестве аргумента. Это отлично. Он продолжает делать это до тех пор, пока "истина" не будет передана в качестве аргумента, и в этом случае вызывающая цепочка вернет "истину".
(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);
(function a(a){
alert(a);
return a;
})
(function b(b){
alert(b);
return b;
})
(function c(c){
alert(c);
return c;
})
(true);
Просто верните следующую часть параметра с символом().
Я возьму на него удар.
(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.