如何使用closure创建的私有函数可以访问构造函数中定义的变量?

时间:2015-12-17 11:56:18

标签: javascript closures

我有以下代码:

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 参数传递)。

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

2 个答案:

答案 0 :(得分:1)

您无法通过闭包访问变量,因为您需要在createTagsArray构造函数中定义TagCloud函数 - 然后您无法从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();
};

答案 1 :(得分:0)

请尝试以下代码:



use strict;
use warnings 'all';

    open(my $fh1, '<', 'sym.dat') or die $!;
    open(my $fh2, '<', 'sym2.txt') or die $!;
    open my $fh_out, '>', 'symout.txt' or die $!;

    until ( eof $fh1 or eof $fh2 ) {

        my @l1 = map hex, split '', <$fh1>;
        my @l2 = map hex, split '', <$fh2>;
        my $n = @l2 > @l1 ? @l2 : @l1;

        my @sum = map {
            no warnings 'uninitialized';
        $l1[$_] + $l2[$_];
    } 0 .. $n-1;
        @sum = map { split //, sprintf '%08X', $_ } @sum;
        print { $fh_out } "reverse @sum\n";
    }
&#13;
&#13;
&#13;