繁体   English   中英

其他地方定义的Java语言关闭

[英]Javascript closure defined elsewhere

这是闭包的简单用法:

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

我想做的是能够在Thing的定义之外定义setXgetX的实现。

我尝试过这样的事情:

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闭包的一部分。 有什么方法可以实现我想要的吗?

您问题的简短答案是“否”。

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

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

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函数可以访问静态定义的封装函数助手。

尝试工厂:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM