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