此JavaScript程序中的控制流

此JavaScript程序中的控制流,javascript,Javascript,最近我跳进了JavaScript编程,昨天我在看关于可变性的视频,我对主机编写的程序完全感到困惑。 这是: 让newObj= { 总数:65, 增量:1 }; const IncrementTotal=函数(obj,val) { obj.increment=val; 返回函数() { 控制台日志(对象总数); obj.total=obj.total+obj.increment; 控制台日志(对象总数); }; }; const incBy1=递增总数(newObj,1); const incB

最近我跳进了JavaScript编程,昨天我在看关于可变性的视频,我对主机编写的程序完全感到困惑。 这是:

让newObj=
{
总数:65,
增量:1
};
const IncrementTotal=函数(obj,val)
{
obj.increment=val;
返回函数()
{
控制台日志(对象总数);
obj.total=obj.total+obj.increment;
控制台日志(对象总数);
};
};
const incBy1=递增总数(newObj,1);
const incBy2=递增总计(newObj,2)

JS测试
我无法理解的是,为什么首先调用incBy2() (我们没有叫它)

您没有调用
incBy2()
。但是您确实通过下面的行调用了
IncrementTotal
,这会增加
obj.increment的值

const incBy2 = IncrementTotal(newObj, 2);
但是为什么数据没有被记录到控制台中四次呢 (每人两次)

这是因为您没有调用
incBy2()

incBy2
刚刚被分配了一个由
IncrementTotal(newObj,2)
返回的函数。除非调用
incBy2()
,否则将无法执行此返回函数。但是,只要调用
constincby2=IncrementTotal(newObj,2)
IncrementTotal
函数被执行并修改对象增量

这就是流程:

incBy1
调用
IncrementTotal(newObj,1)
,它修改对象属性并返回要调用的函数---第一步

然后,
incBy2
调用
IncrementTotal(newObj,2)
,它修改对象属性并返回要调用的函数----步骤2

现在只需调用inc1(),它执行步骤1中返回的函数。执行此函数时,您会看到控制台日志打印两次

如果您调用了
inc2()
,您可以再看到
console.log
两次,总共4次

让newObj=
{
总数:65,
增量:1
};
const IncrementTotal=函数(obj,val)
{
obj.increment=val;
return function()//我们调用它的return function
{
console.log(obj.total);//l1
obj.total=obj.total+obj.increment;//l2
console.log(obj.total);//l3
};
};
const incBy1=递增总数(newObj,1)//这使得obj.increment为1
const incBy2=递增总计(newObj,2)//这将使obj.增加到2
incBy1()//调用该函数时,将执行'returned function',并打印'obj.total',即65`(l1)`然后将obj.total增加到65+2(67)`(l2)`并再次打印'(l3)`。

//incBy2也许对代码进行一些修饰性的修改可以使它更直观

在这个版本中,我重命名了函数和属性名,并且完全删除了
incBy2
变量。(有关进一步的说明,请参见评论。)

//设置对象的初始值
设newObj={
总数:65,
incrementAmount:“我们稍后再设置”
};
//定义我们的主函数,我们将调用它两次
const updateIncrementAndMakeNewFunc=函数(obj,newIncrement){
//调用main函数将改变对象的'incrementAmount'属性
obj.incrementAmount=新增增量;
//调用main函数会创建此新函数,但不会调用它
const newFunc=函数(){
控制台日志(对象当前总计);
//如果调用此函数,它将改变对象的“currentTotal”属性
obj.currentTotal=obj.currentTotal+obj.incrementAmount;
控制台日志(对象当前总计);
};
//新函数将是主函数的输出
返回newFunc;
};
//调用主函数一次
//-将'newObj.incrementAmount'设置为'1',-很好,但这不会持续很久
//-返回一个函数(被指定为新常量的值)
从firstcall返回的const函数=updateIncrementAndMakeNewFunc(newObj,1);
//再次调用主函数
//-将'newObj.incrementAmount'设置为'2',-这就是我们最终看到'67'的原因`
//-返回函数(未分配给任何对象,因此无法使用)
updateIncrementAndMakeNewFunc(newObj,2);
//调用动态创建的函数——到目前为止,它从未被调用过
从FirstCall()返回的函数

JS测试

Hi。谢谢你能告诉我我什么时候打电话给
constincby2=IncrementTotal(newObj,2)?我没有调用上面的一个吗?当你调用
constincby2=IncrementTotal(newObj,2)
您调用了
IncrementTotal
,该函数修改了
obj.increment
,并返回了一个可以调用的函数。请参阅更新后的答案。希望进一步澄清。阅读代码中的流程和注释。那就澄清了啊。我想我明白了
IncrementTotal(newObj,2)
修改
obj.increment
并使其成为
2
。之后,当我调用
incBy1()
时,我得到了
obj.increment=2
。是这样吗?如果是的话,我明白了。没错!好了:)