Javascript闭合在哪种场景下比较好?

问题描述 投票:0回答:1

在什么情况下反1比较好?在什么情况下计数器2会更好?

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

// counter1 code
function counterMaker() {
  let count = 0;
  return function counter() {
    return count++;
  };
}


// counter2 code
let count = 10;

function counter2() {
  return count++;
}
javascript variables scope closures counter
1个回答
1
投票

你可以声明 count 变量,而不需要递增计数,就可以在外层作用域中引用它。

let count = 10;

function counter2() {
  return count++;
}


counter2();
counter2();
console.log(count);

如果 count 变量在一个闭包里面,而闭包只暴露了返回的函数,那么上述方法就不可能了--唯一的选择是调用返回的函数,即使你只想检查它的当前值,它也会递增计数。

第一个方法中 count 只能由 counter 如果您想让消费者清楚地了解 counterMaker 并对守则的读者说 count 变量是 预期 是私有的(外部完全无法访问)。

当你想创建一个名为 多个实例 的计数器,而第二种方法不会(除非你每次想要一个计数器时都重复一个计数器变量和函数,这很傻)。


1
投票

解释计数器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会被调用,它只会增量什么。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.