其他地方定义的Javascript闭包

时间:2016-02-11 19:23:23

标签: javascript

这是一个简单的闭包用法:

function Thing() {
    var _x;
    return {
        setX: function(val) { _x = val; },
        getX: function() { return _x }
    };
}

var a = Thing();
var b = Thing();
a.setX(12);
b.setX(23);
a.getX(); //returns 12

我想要做的是能够在setX的定义之外定义getXThing的实现。

我试过这样的事情:

function setXimpl(val) {
    _x = val;
}

function getXimpl() {
    return _x;
}

function Thing() {
    var _x;
    return {
        setX: setXimpl,
        getX: getXimpl
    };
}

var a = Thing();
var b = Thing();
a.setX(12);
b.setX(23);
a.getX(); //returns 23 not 12!

很明显,setXimplgetXimpl正在设置/读取一些全局范围的_x,而不是在闭包内。

我尝试了很多其他的东西(主要是语法上的修改),但我不能让外部函数成为Thing闭包的一部分。有没有办法达到我想要的目的?

2 个答案:

答案 0 :(得分:1)

你问题的答案非常简短。

闭包工作的原则是访问功能范围内的变量,这些变量在全局范围内是不可访问的。仅当执行获取/设置的函数是已返回的函数(创建闭包)内的嵌套函数时,才会发生这种情况。这意味着每次调用Thing时都必须创建setX和getX的新函数,就像在Thing代码中一样。

这并不意味着从Thing返回的函数不能通过使用(例如)IIFE来调用更接近全局范围的函数 定义事情:

var Thing = function(){

  function a(...) {...}; // create once
  function b(...) {...}; // create once
  return function () {   // the Thing function (create once)
      var _x;
      return {
          setX: function(val) { _x = val; },
          getX: function()    { return _x }
      };
     };
 }();

有效地赋予匿名getter和setter函数访问静态定义的封装函数帮助器。

答案 1 :(得分:0)

尝试工厂:

function setXimplLoader(x) {
  return function setXimpl(val) {
    x.value = val;
  };
}

function Thing() {
  var _x = { value: '' };
  return {
    setX: setXimplLoader(_x),
    getX: function() { return _x.value; }
  };
}

var a = Thing();
var b = Thing();
a.setX(12);
b.setX(23);

console.log(a.getX())

或者使用一些实用程序库: https://lodash.com/docs#partial