Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   При спользовании setinterval метод объекта не принимает аргумент (https://javascript.ru/forum/misc/79834-pri-spolzovanii-setinterval-metod-obekta-ne-prinimaet-argument.html)

tone4ka 31.03.2020 10:18

При спользовании setinterval метод объекта не принимает аргумент
 
[ js ]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>cars</title>
</head>
<body>
<script src="https://code.jquery.com/jquery-2.2.4.js"></script>
<script>

var Car=function(x,y){
this.x=x;
this.y=y;
this.draw();
};

Car.prototype.draw=function(){
var carHtml='<img src="http://nostarch.com/images/car.png">';
this.carElement=$(carHtml);
this.carElement.css({
position:"absolute",
left:this.x,
top:this.y
});
$("body").append(this.carElement);
};

Car.prototype.moveRight=function(s){
this.x+=s;
this.carElement.css({
left:this.x,
top:this.y
});
};

Car.prototype.intRight=function(){
setInterval(this.moveRight(10).bind(this),30);// метод moveRight не принимает аргумент, не выполняется bind
};

var tesla=new Car(20,20);
var kia=new Car(100,200);
tesla.intRight();
kia.intRight();
</script>
</body>
</html>
[ /js ]

Если из метода moveRight(s) убрать переменный аргумент s и заменить его фиксированным значением, то все работает, this при использовании setinterval передается с помощью bind, но как только я заменяю значение сдвига координаты x на переменную s- консоль выдает ошибку bind

рони 31.03.2020 10:35

tone4ka,
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>cars</title>
</head>
<body>
<script src="https://code.jquery.com/jquery-2.2.4.js"></script>
<script>

var Car=function(x,y){
this.x=x;
this.y=y;
this.draw();
};

Car.prototype.draw=function(){
var carHtml='<img src="http://nostarch.com/images/car.png">';
this.carElement=$(carHtml);
this.carElement.css({
position:"absolute",
left:this.x,
top:this.y
});
$("body").append(this.carElement);
};

Car.prototype.moveRight=function(s){
this.x+=s;
this.carElement.css({
left:this.x,
top:this.y
});
};

Car.prototype.intRight=function(){
var move = () => {this.moveRight(2); requestAnimationFrame(move);}
requestAnimationFrame(move);
};

var tesla=new Car(20,20);
var kia=new Car(100,200);
tesla.intRight();
kia.intRight();
</script>
</body>
</html>



[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

рони 31.03.2020 10:43

tone4ka,
или так
Car.prototype.intRight=function(){
setInterval(() => this.moveRight(10),30);
};

или так
Car.prototype.intRight=function(){
var self = this;
setInterval(function() {
    self.moveRight(10)
},30);
};

или так
Car.prototype.intRight=function(){
setInterval(this.moveRight.bind(this, 10),30);
};

tone4ka 31.03.2020 12:01

Ясно, спасибо огромное!


Часовой пояс GMT +3, время: 10:48.