Javascript 将变量设置为函数的实例

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());

我编写此javascript时希望得到以下结果:“X:10”

相反,它抛出此错误:“ReferenceError:x未定义”

这里有什么我不明白的?

将该值作为一个参数传入会更简单(而且它实际上会工作):

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;