我一直在阅读使用HTML5和JavaScript的游戏设计,它向我介绍了对象。因此,在阅读完本书并开展项目后,我决定采用这些新发现的知识并将对象集成到我自己的项目中。所以这是我的问题可以或应该对象调用自己的函数?例如:
var someObject = {
start: function() {
check();
},
check: function() {
console.log("Check!");
}
};
someObject.start();
这本书确实展示了一个带有计时器的例子:
var timer = {
start: function() {
var self = this;
window.setInterval(function(){self.tick();}, 1000);
},
tick: function() {
console.log('tick!');
}
};
在带有timer对象的示例中,它为self调用内部函数,因此这意味着我应该使用self来调用内部函数,或者这是使用对象执行此操作的正确方法吗?还是最佳实践?提前谢谢。
var someObject = {
start: function() {
var self = this;
self.check();
},
check: function() {
console.log("Check!");
}
};
someObject.start();
答案 0 :(得分:6)
JavaScript名称为lexically scoped,因此只要在脚本中遇到名称(变量),JavaScript运行时就必须搜索定义函数的范围。
在定义时,这个功能:
start: function() {
check();
}
无法访问其外部作用域中的任何check
函数。声明self
并将其绑定到this
是一种用于处理(有点有趣)intricacies of referring to the current object in JavaScript的技术(因为示例代码使用window.setInterval
)。
要引用当前对象中的函数,只需使用this
。
var someObject = {
start: function() {
this.check();
},
check: function() {
console.log("Check!");
}
};
答案 1 :(得分:1)
声明和初始化变量(如“self”)的目的是处理this
的值在每次函数调用时重新确定的事实。如果你有一个嵌套在另一个函数中的函数,并且该内部函数需要从外部上下文访问this
的值,那么this
必须保存在另一个变量中 - 你自己的“自我”案件。 (当然,该变量的名称并不重要。)
在您的示例代码中:
var timer = {
start: function() {
var self = this;
window.setInterval(function(){self.tick();}, 1000);
},
tick: function() {
console.log('tick!');
}
};
传递给setInterval()
的函数需要使用“start”函数中this
的值。但是,当调用间隔定时器函数时,this
被设置为其他内容(全局上下文或“严格”模式下的null
)。因此,通过在实例化间隔定时器函数的上下文中保存this
的值,其代码可以使用它来访问定时器对象。
在你的第二个例子中,声明和初始化一个“self”变量不会伤害任何东西,但这是不必要的。有时候它只是为了澄清代码而有用,但当然一个比“自我”更有意义的名字是一个好主意。
答案 2 :(得分:1)
这是javascript函数上下文,每次创建函数时,都会创建一个新的上下文(范围)。
在setInterval()
功能中,您创建了一个新范围,因此this
不再引用上述this
:
var self = this;
setInterval(function() {
self.tick();
}, 1000);
您还可以使用bind()
手动绑定功能的正确上下文(因此您不再需要self
):
setInterval(function() {
this.tick();
}.bind(this), 1000);
更多信息:
答案 3 :(得分:0)
当然一个对象可以而且应该调用它自己的函数,这是在javascript中模拟OOP的唯一方法。我会说这本书正在使用的做法self = this
是不好的,因为this
可以单独使用,但是在第一个例子中,它用于保存这个本来应该是的值。函数本身的this
不是外部类