我写了这个javascript期待以下结果:“X:10”
function sprite() {
var run= function() {
window.setInterval(function(){
console.log("X:"+x.toString());
},gameSpeed);
};
console.log("I'm Alive!");
run();
};
var instance=new sprite();
instance.x=10;
相反,它会抛出此错误:“ReferenceError:x未定义”
我在这里不明白什么?
答案 0 :(得分:1)
只需将该值作为参数传递,它就会更简单(加上实际工作):
function sprite(x) {
var run= function() {
window.setInterval(function(){
console.log("X:"+x.toString());
},gameSpeed);
};
console.log("I'm Alive!");
run();
};
var instance = sprite(10);
您的代码无法正常工作,因为这不是JavaScript对象的工作方式,不止一种方式。一方面,JavaScript中没有隐式this
。即使有,间隔处理程序中的函数的上下文在没有一些额外更改的情况下也是不正确的。
现在,如果您确实希望能够更新记录的值,那么您确实必须使用对象:
function sprite(x) {
var run= function() {
window.setInterval(function(){
console.log("X:"+theSprite.x.toString());
},gameSpeed);
}, theSprite = this;
theSprite.x = x;
console.log("I'm Alive!");
run();
};
var instance=new sprite(10);
// ... later on ...
instance.x = 20;
在构造函数中隐藏对构造对象的引用。该变量随后不会被更改,因此区间处理程序将继续能够使用它来引用sprite对象,并且它的" x"属性。请注意,console.log()
调用也已更改为显式引用该实例。
答案 1 :(得分:1)
使用self来保持对此的引用;这样它将在下次setInterval触发时被捕获
function sprite() {
var self = this;
var run= function() {
window.setInterval(function(){
console.log("X:"+self.x.toString());
},gameSpeed);
};
console.log("I'm Alive!");
run();
};
var instance=new sprite();
instance.x=10;
顺便说一句,你还没有在任何地方定义gameSpeed
答案 2 :(得分:0)
您没有从函数/对象试验中返回任何内容。
即使你回来了,你也没有在使用之前定义X.
如果您想稍后编辑它,请执行以下操作(不要过多更改代码):
var sprite = function(){
var self = this;
self.x = 0;
self.run = (function(){
window.setInterval(function(){
console.log("X:" + self.x.toString());
}, gameSpeed); //assuming gameSpeed ai available in this scope...
}());
console.log('I AM ALIVE MUAHAHAHAH!');
};
var instance = new sprite();
instance.x = 10;