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,但我仍然无法理解这里发生了什么
您有两个函数,我们称它们为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中,函数可以分配给变量。这正是示例代码对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) );
希望你能理解我的解释。