【问题标题】:How private function created with closure can access variable defined in constructor?用闭包创建的私有函数如何访问构造函数中定义的变量?
【发布时间】:2015-12-17 11:56:17
【问题描述】:

我有以下代码:

var TagCloud = (function() {
  var createTagsArray = function() {
    j$("#" + this.cloudId + " a").each(function(index) {
      //bla bla
    });
  }

  function TagCloud(cloudId) {
    this.cloudId = cloudId;
  };

  TagCloud.prototype.createTagCloud = function(){
    createTagsArray(this.cloudId);            
  };

  return TagCloud;
}());

new TagCloud("tagcloud");

我创建 TagCloud 对象。我用闭包创建它以拥有一个私有函数createTagArray。但是在这个函数中,我可以访问 TagCloud 构造函数中定义的变量 - cloudId。当然,在这个例子中,我无法使用 this 获得它。但是有没有办法得到它? (我不想将此值作为函数 createTagArray 参数传递)。

这也是我理解闭包的错误,因为我已经开始使用闭包了。

【问题讨论】:

  • 您通常如何称呼createTagsArray?这会被TagCloud 构造函数调用吗?
  • 看看我的编辑。我想从公共函数 createTagCloud 中使用它

标签: javascript closures


【解决方案1】:

您不能通过闭包访问该变量,因为您需要在 TagCloud 构造函数中定义 createTagsArray 函数 - 然后您将无法从 createTagCloud 方法访问它公开。

但我认为您无论如何都不想访问该变量。您希望访问实例的 .cloudId 属性,为此您需要实例。

将它(属性值或完整实例)作为参数传递实际上是首选。这没有什么问题:

var createTagsArray = function(cloudId) {
  j$("#" + cloudId + " a").each(function(index) {
    //bla bla
  });
}
TagCloud.prototype.createTagCloud = function(){
  createTagsArray(this.cloudId);
};

使用call,您甚至可以传递实例本身,以便您可以以this 的身份访问它:

var createTagsArray = function() {
  j$("#" + this.cloudId + " a").each(function(index) {
    //bla bla
  });
}
TagCloud.prototype.createTagCloud = function(){
  createTagsArray.call(this);
};

从那里您甚至可以轻松地(来回)切换到半私有方法:

TagCloud.prototype._createTagsArray = function() {
  j$("#" + this.cloudId + " a").each(function(index) {
    //bla bla
  });
}
TagCloud.prototype.createTagCloud = function(){
  this._createTagsArray();
};

【讨论】:

  • 这正是我想要的。我想确认一下,有没有可能。并使用“调用” - 这也是我一直在寻找的,因为我试图传递 TagCloud 对象的实例而没有成功。谢谢
【解决方案2】:

试试下面的代码:

function TagCloud(cloudId) {
  var self = this;
  self.createTagsArray = function() {
    console.log(this);
  }

  self.cloudId = cloudId;
  self.createTagCloud = function() {
    self.createTagsArray()
  }
  
  return{
    "cloudId": cloudId,
    "createTagCloud": self.createTagCloud
  }
};

var obj = new TagCloud("tagcloud");
obj.createTagCloud();

var obj = new TagCloud("TagCloudTest");
obj.createTagCloud();

【讨论】:

  • 使用您的解决方案函数 createTagsArray 再次公开。我想隐藏它,这是我使用闭包的方式。看看我的编辑。我想在其他公共函数中使用 createTagsArray 函数
  • 谢谢,您的解决方案是对的。但是您知道是否可以在闭包范围内获取此变量?我对此感到困惑,这让我很好奇
猜你喜欢
  • 2016-01-09
  • 2021-04-17
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
相关资源
最近更新 更多