Я пытаюсь выяснить, откуда c исходит изнутри функции - PullRequest
1 голос
/ 05 мая 2020
var x = 2;
var y = 8;


var a = function(b) {
  return function(c) { 
    var num = Math.abs(b);
    return x + y + Math.abs(b) + c; 
  }; 
};

var fn = a(x);
x = 4;
console.log(fn( Math.random() * 10) );

я попытался консольным журналом a, b, c, и я все еще не могу понять, что здесь происходит

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Извините, это мое первое объяснение, это может быть трудно понять, но я изо всех сил стараюсь объяснить:

Я просто хочу вырвать код:

ваш код :

var x = 2;
var y = 8;


var a = function(b) {
  return function(c) { 
    var num = Math.abs(b);
    return x + y + Math.abs(b) + c; 
  }; 
};

var fn = a(x);
x = 4;
console.log(fn( Math.random() * 10) );

Совершенно запутанно иметь

console.log(fn( Math.random() * 10) )

instead of that line of code, I changed it to 

console.log(fn(10) ) for simplitcity.

Когда вы выполняете var fn = a (x), значение b будет равно 2, а возвращаемому значению будет присвоено значение fn из var a, который на самом деле является функцией

, поэтому здесь fn становится:

var fn = function(c) { 
    var num = Math.abs(b);
    return x + y + Math.abs(b) + c; 
  }; 
x = 4;// x value was changed to 4 instead of 2 from the line 1

теперь он передает значение c через последнюю строку кода, которая:

console.log(fn( Math.random() * 10) );

or 

for simplicity 
console.log(fn(10) );

итак, код будет выглядеть так:


var y = 8;
var fn =  function(c) { 
    var num = Math.abs(b);
    return x + y + Math.abs(b) + c; 
  }; 
x = 4;
console.log(fn(10) );

Надеюсь, вы поняли мое объяснение.

1 голос
/ 06 мая 2020

У вас есть две функции, назовем их 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...