Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未在Javascript函数中更新变量_Javascript_Oop - Fatal编程技术网

未在Javascript函数中更新变量

未在Javascript函数中更新变量,javascript,oop,Javascript,Oop,我正在写一些Javascript项目,在变量更新方面有一些问题。我有这样一个功能: function Bullet(top){ this.top = top; update(); function update(){ this.top -= 5; console.log(this.top) setTimeout(update, 50); } };

我正在写一些Javascript项目,在变量更新方面有一些问题。我有这样一个功能:

function Bullet(top){
        this.top = top;     
        update();

        function update(){
            this.top -= 5;
            console.log(this.top)
            setTimeout(update, 50);
        }
};

Bullet.prototype.getTop = function(){
        return this.top;
    };
当我打电话时:

var bullet = new Bullet(300);

我得到了300的连续控制台输出。当然,当我反复调用bullet.getTop()时,也会得到结果300

现在,我的问题是:为什么会发生这种情况?如何修复它?

函数“update”中的“this”绑定到“update function”上下文,而不是“Bullet function”上下文。因此,当您在函数中使用“this”时,它与包装函数无关,并且当您进行更改时,它仅适用于使用“this”的函数的本地上下文。你可以阅读更多关于“这个”

你可以用两种方法解决这个问题

第一个是调用.bind(context)函数,只返回已调用函数的副本,但该副本绑定到传递的上下文。但是当您使用这种方法时,您必须在函数定义之后调用它

this.top = top

var update = function(){
        this.top -= 5;
        console.log(this.top)
        setTimeout(update, 50);
}.bind(this)

update();
或 使用像bellow这样的JavaScript闭包,您可以定义一个闭包来调用它,让我们说“that”并在其中保存包装器上下文,然后在update函数中使用“that”

var that = this;
function update(){
        that.top -= 5;
        console.log(that.top)
        setTimeout(update, 50);
}

不是您所认为的,请参见
更新
内部,
是窗口,因为没有给定上下文。最好使用
this.update=function(){…};这个.update()
更新调用(此)“连续控制台输出300”这是怎么回事<代码>窗口。top
是一个对象,您应该在
窗口
(或
[对象窗口]
)中获得属性列表