我正试图弄清楚c是从函数内部来的


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 */
};

现在,让我们定义函数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中,函数可以分配给变量。这正是示例代码对vara所做的:将其设置为等于函数a

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

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

现在,在您的代码中,函数anoymous没有名称。但是,我定义的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

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

我只想破解代码:

您的代码:

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) );

希望你能理解我的解释。

最新更新