0

对于我正在处理的项目,我正在构建一些具有以下布局的数据对象(这是我正在使用 ArrayBuffers 读取的二进制文件:

AFile.prototype = {
    p: new BufferPack(),
    filedata: null,
    position: 0,
    label_records: null,
    closestmultipleof: function(n,v) {
        return Math.ceil((v / n) * n);
    },
    r: function(size) {
        result = new Uint8Array(this.filedata,this.position,size);
        this.position += size;
        return result;
    }
    readValueLabel: function() {
        return {
            value: this.rS(8),
            len: this.rS8(),
            label: this.rS(this.closestmultipleof(8, this.len + 1))
        };
    },
    readLabelRecords: function() {
        return {
            rec_type: this.rS32(),
            label_count: this.rS32(),
            value_labels: _.map(_.range(this.label_count), function(num) {
                console.debug(num);
            },this)
        };
    },
    loadFile: function(blob) {
        this.filedata = blob;
        this.label_records = this.readLabelRecords();
    }
};

但是,我似乎在访问返回范围内的值时遇到了问题。在某些返回作用域中,我需要访问同一作用域中的变量以便稍微操作数据(参见 value_labels 的定义)。

只是,它似乎无法访问那里的变量 label_count (可能是因为它在相同的返回范围内)。我怎么能做到这一点?

我可以让它工作的唯一方法是如果我这样做:

ret = {}
ret['a'] = 5;
ret['b'] = ret['a'] * 2
return ret;

但这似乎已经够难看的了。有任何想法吗?

是的,它是一个单身人士!我只会用这个一次。

让我说清楚:问题出在以下代码中:

return {
   a: functionreturn(),
   b: this.a * s
};

this.a 似乎在那里不存在。

4

2 回答 2

1

[更新] 您可以为 label_count 创建一个闭包。

function AFile(){};
AFile.prototype ={
    readLabelRecords: function() {
        label_count=this.rS32();
        return {
            label_count:label_count,
            log:console.log(label_count)//'return from rs32'
        };
    },
};
AFile.prototype.rS32=function(){
  return "return from rs32";
}
var o = new AFile();
o.readLabelRecords();

该答案基于提供的代码,最简单的重新生成代码:

function complicatedCalculations(){
  return 22;
}
function returnObject(){
  var cacheComplicated=complicatedCalculations();//closure variable will
         // be available within the entire body of returnObject function
         // but never outside of it.
  return{
     calculated:cacheComplicated,
     twiceCalculated:cacheComplicated*2//you could not access calculated
                           // here so using a cache closure variable
  }
}

或者让您的 returnObject 函数返回使用构造函数创建的对象的新实例:

function returnObject(){
  return new (function(){
    this.calculated=complicatedCalculations();
    this.twiceCalculated=this.calculated*2;
  })();
}
于 2013-06-19T07:26:46.967 回答
0

您忘记了一个逗号,readValueLabel它使结构无效。

更新

太糟糕了,另一个答案被删除了,即使它没有“编译”它也有一个有效的点。引用this在 JS 的内部范围内是有问题的,但可以通过执行以下操作来解决它:

readLabelRecords: function() {
        var that = this;
        return {
            rec_type: that.rS32(),
            label_count: that.rS32(),
            value_labels: _.map(_.range(that.label_count), function(num) {
                console.debug(num);
            },that)
        };
    }
于 2013-06-19T06:50:24.800 回答