Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何删除`for`块中的`let`重新分配_Javascript_Typescript - Fatal编程技术网

Javascript 如何删除`for`块中的`let`重新分配

Javascript 如何删除`for`块中的`let`重新分配,javascript,typescript,Javascript,Typescript,我试图在for块范围内删除下面函数中的let重新分配。 我想在for循环的块范围内累加值,但不想访问for循环块范围之外的闭包或全局变量(totalValue)。 因为它使代码对于更大的函数更具可读性和可维护性 我正在寻找任何替代方法来删除let-re-assignment模式,如下所示,以实现相同的功能 函数howToRemoveLetReassignmentForTheBelowScenario(目标:编号){ 设totalValue:number=0; 为了( 设i=0; i acc+=(

我试图在for块范围内删除下面函数中的
let
重新分配。 我想在for循环的
块范围内累加值,但不想访问
for循环块范围之外的闭包或全局变量(
totalValue
)。 因为它使代码对于更大的函数更具可读性和可维护性

我正在寻找任何替代方法来删除
let-re-assignment模式
,如下所示,以实现相同的功能

函数howToRemoveLetReassignmentForTheBelowScenario(目标:编号){
设totalValue:number=0;
为了(
设i=0;
i
使用
数组(n)
可以使用
减少

const目标=10;
常量totalValue=[…数组(目标).keys()]
.减少((acc,值)=>
acc+=(值+数学.random())
);
console.log(totalValue)使用
数组(n)
您可以使用
reduce

const目标=10;
常量totalValue=[…数组(目标).keys()]
.减少((acc,值)=>
acc+=(值+数学.random())
);

console.log(totalValue)我认为没有办法使用“for”循环。如果变量范围仅在for循环内,我们如何返回for循环外的变量?“for”不是一个返回某些内容的函数。

我认为没有办法使用“for”循环。如果变量范围仅在for循环内,我们如何返回for循环外的变量?“for”不是一个返回某些内容的函数。

我不太清楚您所说的“让重新分配模式”是什么意思。您可以选择一个循环(
for
while
),或者像在其他答案中一样使用array reduce。我的观点是
for
循环比创建数组和使用array reduce更具可读性。我不知道这是否只是因为我对JavaScript比较陌生。您仍然需要在循环中运行相同的代码来计算小计(
subtotal+=newValue
)。我觉得,作为一名读者,代码中发生的事情非常明显——函数编写得很好,在正确的范围内定义变量,并执行单个简单的任务)。它只需要一个描述功能的名称,就可以让用户立即看到它

另一个可能的考虑因素是(从一些目标为1000的测试中),一个
for
循环在0.02ms时进入,创建一个数组,然后执行数组reduce需要0.14ms到0.7ms之间的时间。虽然0.7ms仍然很小,但它似乎是为了获得很少的可读性而做出的牺牲

如果您真的关心可读性,我建议您使用具有自解释名称和清晰方法名称的类。这使得读者在阅读时可以真正理解该功能:

class Accumulator {
    #subtotal = 0;
    add(n: number) {
        this.#subtotal += n;
    }
    getTotal() {
        return this.#subtotal;
    }
}

function sumConsecutiveNumbers(from: number, to: number) {
    let accumulator = new Accumulator();
    for (let i=from; i <= to; i++) accumulator.add(i);
    return accumulator.getTotal();
}

类累加器{
#小计=0;
添加(n:编号){
这是#小计+=n;
}
getTotal(){
返回此项。#小计;
}
}
函数sumconsuitenumbers(from:number,to:number){
设累加器=新累加器();

对于(let i=from;i我不太清楚“let reassignment pattern”是什么意思。您可以选择循环(
for
while
)或者像其他答案一样使用array reduce。我的观点是,for
循环比创建数组和使用array reduce更具可读性。我不知道这是否只是因为我对JavaScript比较陌生。您仍然需要在循环中运行相同的代码来计算小计(
subtotal+=newValue
)。我觉得,作为一名读者,很明显您的代码中发生了什么-函数编写得很好,在正确的范围内定义了变量,并执行了一项简单的任务)。它只需要一个描述功能的名称,就可以让用户立即看到它

另一个可能的考虑因素是(从一些目标为1000的测试中),一个
for
循环在0.02毫秒时进入,创建一个数组,然后执行一个数组reduce需要0.14毫秒到0.7毫秒。虽然0.7毫秒仍然很小,但它似乎是为了获得很少的可读性而做出的牺牲

如果您真的关心可读性,我建议您使用一个具有自解释名称和清晰方法名称的类。这样,当读者看到它时,就可以真正理解该功能:

class Accumulator {
    #subtotal = 0;
    add(n: number) {
        this.#subtotal += n;
    }
    getTotal() {
        return this.#subtotal;
    }
}

function sumConsecutiveNumbers(from: number, to: number) {
    let accumulator = new Accumulator();
    for (let i=from; i <= to; i++) accumulator.add(i);
    return accumulator.getTotal();
}

类累加器{
#小计=0;
添加(n:编号){
这是#小计+=n;
}
getTotal(){
返回此项。#小计;
}
}
函数sumconsuitenumbers(from:number,to:number){
设累加器=新累加器();

for(让i=from;i到目前为止您尝试了什么?如果您在
for
循环范围中定义totalValue,则无法在函数范围中访问它(除非您将其定义为var),最好使用
.reduce()
@y2bd,@trash\u dev:我试图使用reduce,但我们无法使用reduce,因为函数中没有数组。迭代是根据条件
I
进行的,其中两者都是
number
类型。@sashank您可以使用
[…array(target).keys()基于
目标创建数组
然后使用
reduce
。到目前为止您尝试了什么?如果您在
循环作用域中为
定义totalValue,则无法在函数作用域中访问它(除非您将其定义为var),最好使用
.reduce()
@y2bd,@trash\u dev:我尝试使用reduce,但无法使用reduce,因为函数中没有数组。迭代