3

试图让下面的代码工作;由于为 store 变量分配了一个匿名对象,因此使用函数调用填充“数据”属性。此设置还应设置其他对象的属性“masterData”的内容。我希望“this”关键字引用正在创建的匿名对象,但我错了......

    var store = {

        masterData : [],

        revert: function() {

            this.data = shallowCopy(this.masterData);
        },

        data: (function() {

            var overviewData = getOverviewData();
            this.masterData = overviewData;
            return chartData;

            }).call(),
    };

另请参阅“恢复”属性;它提供了一个函数,该函数将创建对象数据属性内容的副本。

应该使用什么,因为“this”返回 DOMWindow 对象?

4

4 回答 4

2

我有同样的问题,我只是通过发送带有函数的范围来解决它。

    var self = this;
    setInterval( yourFunction(self), 1000);

    yourFunction:function( self )
    {
        console.log(this);
        console.log(self);
    }

您会看到,当它记录“this”时,它指的是 DOM,而 self 指的是您来自哪里。我希望这有帮助!:)

编辑:不是在数据内部设置masterData,而是在创建数据后设置主数据。

var store = {

    masterData : [],

    revert: function() {

        this.data = shallowCopy(this.masterData);     //Here is where you create data
        masterData = this.data.overviewData;       //set the masterData
    },

    data: (function() {

        var overviewData = getOverviewData();
        return chartData;

        }).call(),
};

我认为这应该可行,否则对不起:)

于 2012-04-26T10:44:18.820 回答
2

data在定义对象之前调用该函数;this在该对象出现之前不会是该对象的别名。您可以将构造函数与私有的短期变量一起使用:

var getOverviewData = function () { return "I'm overview data!" }
var chartData = "I'm chart data!"

var store = new function () {
  var _masterData
  this.revert = function() {
    this.data = shallowCopy(this.masterData)
  }
  this.data = (function() {
    _masterData = getOverviewData()
    return chartData
  }).call()
  this.masterData = _masterData
}()

console.log(store)
// { revert: [Function],
//   data: 'I\'m chart data!',
//   masterData: 'I\'m overview data!' }
于 2012-04-26T11:04:17.743 回答
1

改变流线

}).call(),

})()

或者,如果您真的想使用该call方法:

 }).call(store)
于 2012-04-26T11:15:31.360 回答
0

this调用匿名函数时不会引用当前对象,因为它不遵循在作用域中设置的模式,obj.func()并且不受其他方式的约束。相反,它指的是全局窗口对象(或在严格模式下)。thisfuncobjundefined

callapply并且bind没有帮助,因为store尚未定义对象,因此没有对象可以作为thisArg参数提供。另一方面, with store.revert,thisstore的是它被调用的时间并按预期运行。

该示例似乎过于做作,因为没有明显的动机将设置masterData作为也设置的匿名函数的副作用data。看来您可以执行以下操作:

// some sameple funcs and data for testing purposes
var getOverviewData = function () { return [42]; };
var shallowCopy = function (a) { return a.slice(); };
var chartData = [24];

var store = {
  masterData: getOverviewData(),

  revert: function () {
    this.data = shallowCopy(this.masterData);
  },

  data: chartData,
};

console.log(store.data);
store.revert();
console.log(store.data);

一般来说,如果一个模式看起来很难应用,它通常是不必要的,或者是实现预期结果的次优方式。OP 提出的dataIIFE setter 打破了经验法则:它没有单一的职责,并通过改变对象而产生副作用。

现在,假设您在定义此属性时确实需要thisIIFE访问(或者对于确实有正当动机的未来读者),有多种方法可以实现这一点。

最明显和直接的解决方案是创建store对象,然后添加数据并在第二步中对其进行变异:

var getOverviewData = function () { return [42]; };
var shallowCopy = function (a) { return a.slice(); };
var chartData = [24];

var store = {
  masterData: [],

  revert: function () {
    this.data = shallowCopy(this.masterData);
  },
};
store.data = (function () {
  this.masterData = getOverviewData();
  return chartData;
}).call(store);

console.log(store.data);
store.revert();
console.log(store.data);

如果你不喜欢这两个步骤,你可以把它扔进 IIFE:

var getOverviewData = function () { return [42]; };
var shallowCopy = function (a) { return a.slice(); };
var chartData = [24];

var store = (function () {
  var store = {
    masterData: [],

    revert: function () {
      this.data = shallowCopy(this.masterData);
    },
  };
  store.data = (function () {
    this.masterData = getOverviewData();
    return chartData;
  }).call(store);
  return store;
})();

console.log(store.data);
store.revert();
console.log(store.data);

另一种方法是使用此处所示的构造函数并调用它new,使您可以访问this上下文。

您正在使用的 IIFE 可能是一个完全独立的函数,它接受一个对象作为参数并改变它的两个属性,但这只是为了完整性而提及;它可能仅在您计划为多个对象重用该函数时才有用,在这种情况下,您不妨创建一个成熟的或非 IIFE 构造函数。

于 2020-11-23T16:40:04.190 回答