繁体   English   中英

我想弄清楚 c 来自 function 内部的位置

[英]I am trying to figure out where the c is coming from inside the function

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,但我仍然无法理解这里发生的事情

你有两个函数,我们称它们aanonymous

a这样的:

var a = function(b) {
  /* do stuff */
};

这相当于

function a(b) {
  /* do stuff */
};

现在,让我们定义 function 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所做的:将其设置为等于 function a

由于这种将函数分配给变量的能力,函数实际上可以将其他函数作为值返回。 这也正是a所做的。 它返回 function anonymous

var a = function(b) {
  return anonymous;
};

现在,在您的代码中, function 匿名没有名称。 但是,我定义的anonymous等于您a返回的未命名的 function。 让我们将其替换为上一个代码块中的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时,function。 回想一下,匿名接受一个参数,并将该参数命名为c

因此,当我们调用fn(Math.random() * 10)时,fn 被替换为anonymous ,并且由于anonymous的参数是Math.random() * 10 ,所以当anonymous执行时, c = Math.random() * 10

对不起,这是我的第一个解释,可能很难理解,但我正在尽力解释:

我只想破解代码:

你的代码:

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 的返回值,它确实是 function

所以这里 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) );

希望你能理解我的解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM