在单个函数中声明对象重复使用的范围

时间:2013-08-01 14:34:31

标签: javascript object scope

我很困惑这些是宣布这个对象的最有效/最佳实践方式。

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

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
   }

})();

还是我还没考虑过的其他事情?

2 个答案:

答案 0 :(得分:2)

第三个是你所呈现的三个中最“安全”的,但它几乎没有效用,因为在你最初调用它之后它里面的对象是不可访问的。

根据您想要做的事情的复杂程度,简单的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的力量的一小部分。

答案 1 :(得分:0)

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