【问题标题】:Which scope to declare an object for repeated use within a single function声明对象以在单个函数中重复使用的范围
【发布时间】:2013-08-01 14:34:30
【问题描述】:

我很困惑,其中哪一种是声明此对象的最有效/最佳实践方式。

在我重用的函数内部,但我认为这意味着每次调用函数时都会声明它

function mapVals(ele){

  var myObj = {
    "chkOne" : "HV1",
    "chkTwo" : "HV2",
    "chkThree" : "HV3"
  }

  var thisVal = myObj[ele.id];
  //Other code
}

在函数之外,但它正在污染全局命名空间

var myObj = {
  "chkOne" : "HV1",
  "chkTwo" : "HV2",
  "chkThree" : "HV3"
}

function mapVals(ele){      
  var thisVal = myObj[ele.id];
  //Other code
}

或者也许是一种封装技术来创建一个临时范围?我知道语法,但以前没用过。

(function(){

  var myObj = {
     "chkOne" : "HV1",
     "chkTwo" : "HV2",
     "chkThree" : "HV3"
   }

   function mapVals(ele){      
      var thisVal = myObj[ele.id];
      //Other code
   }

})();

或者还有什么我没有考虑过的?

【问题讨论】:

  • 为什么人们在投反对票时不能发表评论?如果没有解释为什么有人不喜欢我的问题,那么我下次不知道并且能够纠正这个错误吗?
  • 在您的第三个示例中,请注意 mapVals 函数将无法被该范围之外的任何东西访问(可以修改以允许它),但它不会做任何事情。
  • 这还取决于您对myObj 所做的什么。在您的示例中,您只是从中得到 东西。如果您正在修改对象并且您不希望所有函数共享该对象(由于某种原因,它们每个都需要修改本地副本),那么您必须坚持使用第一个示例。否则,您的第二个和第三个示例 share 单个对象(可能需要也可能不需要)
  • @Ian 我只是从对象中检索数据而已。该函数将在一组复选框的状态更改时调用,然后我将使用其映射值的字符串(列表)填充隐藏字段。我不知道如果用户在一次又一次地声明对象方面单击左右和中心的东西,第一个选项是否代价高昂。
  • 嗯,是的,我认为这会很昂贵,因为它必须在每次函数调用时创建对象。所以我会坚持第三个,因为它不会在全球范围内公开myObj。 NickTomlin 的回答很棒,我会同意的

标签: javascript object scope


【解决方案1】:

第 3 个是您介绍的三个中最“安全”的,但它几乎没有实用性,因为在您最初调用它之后,其中的对象无法访问。

根据你想做的事情的复杂程度,一个简单的module 模式可能是最好的选择:

var module = (function(){

  var myObj = {
     "chkOne" : "HV1",
     "chkTwo" : "HV2",
     "chkThree" : "HV3"
   };

  return {
    mapVals: function (ele){      
      var thisVal = myObj[ele.id];
   }, 
    setVal: function (prop,value) {
      myObj[prop] = value;
    },
    getVal : function (val) {
      return myObj[val];
    }
  };

})();

// we can access and modify properties of myObj within the closure
module.mapVals('chkOne');
module.setVal('foo','bar');
console.log(module.getVal('foo'));

JSbin

这允许您将代码“密封”在一个闭包中,其中myObj 只定义一次,而且还可以导出方法以在您的应用程序中进一步访问myObj(或模块内声明的其他变量)。这是closures的力量的小尝试。

【讨论】:

  • 第三个怎么比第一个优势小? myObj 不需要在第二个/第三个函数调用中创建。 the values are inaccessible after you initially invoke them 是什么意思?
  • 感谢示例和“闭包”链接,那里有一些很好的解释。
  • @Ian 你指出这一点是对的。我过于关注示例的“范围”方面。我已经相应地编辑了我的答案。
【解决方案2】:

如果您不想污染全局命名空间,第三个选项可能是您的最佳选择。

【讨论】:

  • 除此之外,在每个函数调用上创建myObj不是更有效吗(第一个和第二个示例之间的区别)?跨度>
猜你喜欢
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 2016-01-23
  • 2018-07-12
  • 1970-01-01
  • 2011-06-12
相关资源
最近更新 更多