У вас есть две функции, назовем их a
и anonymous
.
a
это:
var a = function(b) {
/* do stuff */
};
Что эквивалентно
function a(b) {
/* do stuff */
};
Теперь, давайте определим функцию anonymous
:
function anonymous(c) {
var num = Math.abs(b); // note that 'b' is pulled in from the parent's scope
return x + y + Math.abs(b) + c; // note that 'x' and 'y' also pulled in from the parent's scope
};
В javascript функции могут быть присвоены переменным. Это именно то, что ваш пример кода делает с var a
: устанавливает его равным функции a
.
Благодаря этой способности назначать функции переменным, функции могут фактически возвращать другие функции как ценность. Это именно то, что делает a
. Он возвращает функцию anonymous
.
var a = function(b) {
return anonymous;
};
Теперь в вашем коде анонимная функция не имеет имени. Но anonymous
, который я определил, равен безымянной функции, которую возвращает ваш a
. Давайте заменим его на anonymous
из предыдущего блока кода.
var a = function(b) {
return function(c) {
var num = Math.abs(b);
return x + y + Math.abs(b) + c;
};
};
Вы могли бы эквивалентно написать:
var a = function(b) {
var anonymous = function(c) {
var num = Math.abs(b);
return x + y + Math.abs(b) + c;
};
return anonymous;
};
Таким образом, когда вы вызываете var fn = a(x)
, fn = anonymous
, функция. Напомним, что анонимный принимает аргумент и называет этот аргумент c
.
Таким образом, когда мы вызываем fn(Math.random() * 10)
, fn заменяется на anonymous
, а поскольку аргумент anonymous
равен Math.random() * 10
, когда выполняется anonymous
, c = Math.random() * 10