Javascript 变量和函数的作用域

Javascript Scope in variables and functions

在我的一次采访中,我得到了这个片段来调试。

var module = (function sumModule(){
  
  var a = 0;
  var b = 0;
  
  const init = (a,b) =>{
    a = a;
    b = b;
  }
  
  function sum() {
    return a+b;
  }
  
  return {
  sum: sum,
  init
  }
  
})();

module.init(1,2);
console.log(module.sum())

返回的值为 0 (0+0),func init 中 a 和 b 的赋值没有覆盖全局 var avar b。为什么会这样,有人能解释一下吗?

注意:有人告诉我在不重命名函数参数的情况下修复它 (a,b)

因为init()函数赋值中的ab指的是它的参数,而不是外层的ab。 所以这些分配不会影响外部 ab.

的值

除了重命名参数,您还可以通过 命名空间 引用全局变量,就像您使用 init 函数一样。

*或者只要重命名全局变量,如果允许的话

var module = (function sumModule(){
  var a = 0;
  var b = 0;
  
  const init = (a, b) => {
    module.a = a;
    module.b = b;
  }
  
  function sum() {
    return module.a + module.b;
  }
  
  return {
    sum: sum,
    init,
  }
  
})();

module.init(1, 2);
console.log(module.sum())

来自@reyno 的修改后的答案。 他的示例只是在 .init 调用之后将 a & b 猴子修补到 module 对象。因此这个变量是 public 并且不再是私有的。

这样你会得到相同的结果,但将变量 a 和 b 保持私有。

为此,请使用私有命名空间对象,就像我对 private 所做的那样。

var module = (function sumModule(){

  var private = {
    a: 0,
    b: 0
  }
  
  const init = (a, b) => {
    private.a = a;
    private.b = b;
  }
  
  function sum() {
    return private.a + private.b;
  }
  
  return {
    sum: sum,
    init,
  }
  
})();

console.log(module) // no a or b property
module.init(1, 2);
console.log(module.sum())
console.log(module)  // still no a or b property