【问题标题】:Javascript Scope in variables and functions变量和函数中的 Javascript 范围
【发布时间】:2021-12-18 11:59:53
【问题描述】:

我在一次采访中得到了这个 sn-p 来调试。

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) 的情况下修复它。

【问题讨论】:

    标签: javascript node.js scope


    【解决方案1】:

    除了重命名参数之外,您还可以像使用 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())

    【讨论】:

    • 这只猴子只将ab 修补到模块范围,并且不会覆盖本地/私有a&b。将console.log(module) 放在module.init() 之前,然后在您致电.sum 之后,您就会明白我的意思。 a&b 在模块对象上不存在,您在对对象的 init 调用之后猴子修补它们。私有 a&b 仍为 0。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      来自@reyno 的修改答案。 他的示例只是在.init 调用之后将ab 修补到module 对象。因此这个变量是公开的,不再是私有的了。

      这样你会得到相同的结果,但保持变量 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-04
        • 1970-01-01
        • 2014-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多