尝试使用以下代码;由于为store变量分配了一个匿名对象,因此使用函数调用填充“data”属性。此设置还应设置其他对象的属性“masterData”的内容。我希望“this”关键字引用正在创建的匿名对象,但我错了......
var store = {
masterData : [],
revert: function() {
this.data = shallowCopy(this.masterData);
},
data: (function() {
var overviewData = getOverviewData();
this.masterData = overviewData;
return chartData;
}).call(),
};
另见“revert”属性;它给出了一个函数,它将创建对象的数据属性内容的副本。
应该使用什么,因为“this”返回DOMWindow对象?
答案 0 :(得分: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(),
};
我认为这应该有效,否则抱歉:)
答案 1 :(得分: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!' }
答案 2 :(得分:1)
更改以下行
}).call(),
到
})()
或者,如果您真的想使用call
方法:
}).call(store)
答案 3 :(得分:0)
this
不会在调用匿名函数时引用当前对象,因为它不遵循obj.func()
模式,后者在this
范围内设置了func
到obj
并不受其他方式的约束。而是引用global window object(或strict mode中的undefined
)。
call
,apply
和bind
没有帮助,因为尚未定义store
对象,因此没有对象可以作为{{1} }参数。另一方面,对于thisArg
,store.revert
在被调用时this
指向store
并表现出预期的行为。
该示例似乎过于人为,因为没有明显的动机将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提出的data
IIFE设置器打破了经验法则:它没有单一职责,并且通过使对象变异而产生副作用。
现在,假设您在定义此属性时确实确实需要从IIFE访问this
(或者对于确实有正当动机的未来读者),有多种实现方法。 / p>
最明显和直接的解决方案是创建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);
一种替代方法是使用here所示的构造函数,并使用new
调用它,从而使您可以访问this
上下文。
您正在使用的IIFE可能是一个单独的函数,完全可以接受一个对象作为参数并对其上的两个属性进行突变,但这只是出于完整性的考虑;仅当您计划将函数重用于多个对象时,它才可能有用。在这种情况下,您最好创建一个成熟的class或非IIFE构造函数。