0

我很困惑哪些是声明此对象的最有效/最佳实践方式。

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

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
   }

})();

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

4

2 回答 2

2

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

根据您想要做的事情的复杂性,一个简单的模块模式可能是最好的选择:

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在您的应用程序中进一步访问(或模块内声明的其他变量)。这是一个小小的闭包威力的滋味。

于 2013-08-01T14:44:01.997 回答
0

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

于 2013-08-01T14:36:21.480 回答