Javascript 将变量设置为函数的实例
我编写此javascript时希望得到以下结果:“X:10” 相反,它抛出此错误:“ReferenceError:x未定义” 这里有什么我不明白的?将该值作为一个参数传入会更简单(而且它实际上会工作):Javascript 将变量设置为函数的实例,javascript,function,instance,Javascript,Function,Instance,我编写此javascript时希望得到以下结果:“X:10” 相反,它抛出此错误:“ReferenceError:x未定义” 这里有什么我不明白的?将该值作为一个参数传入会更简单(而且它实际上会工作): function sprite(x) { var run= function() { window.setInterval(function(){ console.log("X:"+x.toString());
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中没有隐式的这个。即使存在,如果没有一些额外的更改,间隔处理程序中函数的上下文也不会正确
现在,如果您确实希望能够更新记录的值,那么您确实需要使用一个对象:
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()
调用也更改为显式引用实例。您没有从函数/对象试用返回任何内容
即使返回,在使用X之前也没有定义X
如果以后要编辑,请执行以下操作(不要过多更改代码):
勾选:使用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;
顺便说一句,你还没有在任何地方定义游戏速度sprite()
不会返回anything@StephenThomas你认为为什么需要这样做?他们正在使用new sprite()
实例将被分配一个空object@StephenThomas不,不是,你在哪里看到的?你知道new
操作符是如何工作的吗?@stephenThomas知道new
关键字会改变你期望的行为。我很想这样做,但我想稍后编辑此值并显示效果。可能会将内部实例
变量名更改为其他名称,因此,它不能与外部实例
混淆。我很困惑,直到我几乎看不到,instance=this代码>@Pointy工作!附带问题,如果我不能解决这个问题,我是否需要对JS和“this”关键字有更深入的了解?@user29619是的,了解this
在JavaScript中的工作原理非常重要-它与其他看起来类似的语言有很大的不同。关于这件事有很多问题。就像我的建议一样,这与退货无关。事实上,他没有在任何地方定义x,他可能想访问实例的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;
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;