哪种Javascript闭包方案是首选?

在什么情况下计数器 1 更可取?在什么情况下计数器 2 会更好?


我知道当全局声明变量时可能是不可预测的,但是是否有一种情况会比在函数中声明它更可取?


// counter1 code

function counterMaker() {

  let count = 0;

  return function counter() {

    return count++;

  };

}



// counter2 code

let count = 10;


function counter2() {

  return count++;

}


30秒到达战场
浏览 132回答 3
3回答

森林海

如果您希望变量在其他位置可引用,则可以在外部作用域中声明该变量,而不必增加计数:countlet count = 10;function counter2() {  return count++;}counter2();counter2();console.log(count);如果变量位于闭包内,并且闭包仅公开返回的函数,则上述操作是不可能的 - 唯一的选择是调用返回的函数,即使您只想检查其当前值,该函数也会递增计数。count第一种方法,其中只能由闭包中的函数查看,如果你想向代码的使用者和读者清楚地表明变量是私有的(并且在外部完全不可访问),这将是有用的。countcountercounterMakercount当您想要创建计数器的多个实例时,第一种方法也可以工作,而第二种方法则不行(除非您每次需要计数器时都重复计数器变量并运行函数,这很愚蠢)。

白板的微信

计数器 1 代码的说明。// counter1 codefunction counterMaker() {  let count = 0;  return function counter() {    return count++;  };}在这里,您将函数返回给调用方。因此,可以在呼叫者处执行类似操作。var c = counterMaker()c() //0c() //1c() //1var b = counterMaker()b() //0b() //1b() //1因为您在尝试使用函数表达式时尝试将该函数和变量环境括起来。因此,您的增量函数不会暴露在外部。如果这有意义,那么你就会明白为什么闭包和闭包在哪里的整个简洁性。代码 2 的说明// counter2 codelet count = 10;function counter2() {  return count++;}您正在尝试将递增函数公开到全局中,现在您将无法创建像上面代码 1 那样的多个实例。因此,每次调用函数 counter2 时,它只会增加 whatsover。

红颜莎娜

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

相关分类

JavaScript