我对 JavaScript 比较陌生,无法理解为什么会发生此错误:
TypeError:试图分配给只读属性。MyTimer.js:35
我知道显示此错误是因为我使用的是严格模式,但我启用了严格模式来帮助我调试此对象。
创建MyTimer
单例的调用是:
var simTimer = new SimTimer();
然后我添加一个要执行的任务,MyTimer
如下所示:
var task = function(){
console.log("performing task.");
};
simTimer.addTask(task);
最后,这是MyTimer
对象(标记了第 35 行):
var MyTimer = (function () {
"use strict";
// var timer;
var tasks;
/**
* If an instance of MyTimer exists, it will be saved to this variable and returned
* by any subsequent calls to this constructor, thus only one instance (stored in this
* variable) will be accessible.
* @private
*/
var instance;
/**
* Called to initialize this MyTimer Object, or return #instance if it already contains
* an instance of this Object.
*/
function Singleton() {
if (instance) {
return instance;
}
instance = this;
tasks = $.Callbacks();
this.timer = setInterval(function()
{
this.tasks.fire();
}, 1000);//<---- THIS IS LINE 35!
this.addTask = function(task)
{
this.tasks.add(task);
};
this.removeTask = function(task)
{
this.tasks.remove(task);
};
}
//instance accessor
Singleton.getInstance = function () {
return instance || new Singleton();
};
return Singleton();
}());
我没有掌握什么?我已经阅读了很多关于Module Patterns的文档,并且之前已经成功编写过 Singletons - 那么我在这里哪里出错了?
** 编辑: **
我能够通过删除并在using中var tasks
创建它来获得正确的行为。该函数的工作版本现在如下所示:Singleton
this
function Singleton() {
if (instance) {
return instance;
}
instance = this;
this.tasks = $.Callbacks();
this.timer = setInterval(function(){
instance.tasks.fire();
}, 1000);
this.removeTask = function(task)
{
instance.tasks.remove(task);
};
this.addTask = function(task)
{
instance.tasks.add(task);
};
}
所以我仍然不完全理解 - 为什么这个改变能解决它?毕竟是范围问题吗?