为了账号安全,请及时绑定邮箱和手机立即绑定

哪种Javascript闭包方案是首选?

哪种Javascript闭包方案是首选?

30秒到达战场 2022-08-18 15:50:12
在什么情况下计数器 1 更可取?在什么情况下计数器 2 会更好?我知道当全局声明变量时可能是不可预测的,但是是否有一种情况会比在函数中声明它更可取?// counter1 codefunction counterMaker() {  let count = 0;  return function counter() {    return count++;  };}// counter2 codelet count = 10;function counter2() {  return count++;}
查看完整描述

3 回答

?
森林海

TA贡献2011条经验 获得超2个赞

如果您希望变量在其他位置可引用,则可以在外部作用域中声明该变量,而不必增加计数:count


let count = 10;


function counter2() {

  return count++;

}



counter2();

counter2();

console.log(count);

如果变量位于闭包内,并且闭包仅公开返回的函数,则上述操作是不可能的 - 唯一的选择是调用返回的函数,即使您只想检查其当前值,该函数也会递增计数。count


第一种方法,其中只能由闭包中的函数查看,如果你想向代码的使用者和读者清楚地表明变量是私有的(并且在外部完全不可访问),这将是有用的。countcountercounterMakercount


当您想要创建计数器的多个实例时,第一种方法也可以工作,而第二种方法则不行(除非您每次需要计数器时都重复计数器变量并运行函数,这很愚蠢)。


查看完整回答
反对 回复 2022-08-18
?
白板的微信

TA贡献1883条经验 获得超3个赞

计数器 1 代码的说明。


// counter1 code

function counterMaker() {

  let count = 0;

  return function counter() {

    return count++;

  };

}

在这里,您将函数返回给调用方。因此,可以在呼叫者处执行类似操作。


var c = counterMaker()

c() //0

c() //1

c() //1

var b = counterMaker()

b() //0

b() //1

b() //1

因为您在尝试使用函数表达式时尝试将该函数和变量环境括起来。因此,您的增量函数不会暴露在外部。如果这有意义,那么你就会明白为什么闭包和闭包在哪里的整个简洁性。


代码 2 的说明


// counter2 code

let count = 10;


function counter2() {

  return count++;

}

您正在尝试将递增函数公开到全局中,现在您将无法创建像上面代码 1 那样的多个实例。因此,每次调用函数 counter2 时,它只会增加 whatsover。


查看完整回答
反对 回复 2022-08-18
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

我认为在这种情况下,通过闭包访问变量比访问外部变量更可取。访问外部变量会产生副作用,您的函数依赖于在其外部发生的变化,并且它们可能是不可预测的。或者,将来,您将要移动此函数,您仍然需要监视此外部变量。我认为所有外部依赖关系都应该通过参数传递给函数。


查看完整回答
反对 回复 2022-08-18
  • 3 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信