setInterval为什么只运行了一次?

bringtree 2016-11-24 11:13:10
function Satellite(id,speed) {
this.id = id;
this.speed = speed;
this.power = 100;
this.state = "stop";
setInterval((function (_this) {
if(_this.state == "run" && _this.power >0 ){_this.power -= 1;}
else if(_this.state == "stop" && _this.power<100 ){_this.power += 1;}
else {_this.state = "stop";}
console.log(_this);
})(this),1000);

}

var test = new Satellite(1,10);
test.state = "run";
...全文
250 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
天际的海浪 2016-11-25
  • 打赏
  • 举报
回复

需要传参数的话就需要再包裹一层函数

setInterval(function () {
	(function (a) {
		//code
	})(123)
}, 1000);

或者在ie9以后可以用 bind()

setInterval(function (a) {
	//code
}.bind(this,123), 1000);
天际的海浪 2016-11-25
  • 打赏
  • 举报
回复
JS中的函数是一种叫做Function引用类型的实例,因此函数是一个对象。函数名则是指向这个对象的引用地址。 做为一个对象,函数是可以赋值传递的。 setInterval方法的第一个参数所需要的是函数对象的引用地址。 函数后面不加圆括号()就是获取函数对象的引用地址,(这样不调用执行函数)。 如: setInterval(time,10); 表示把函数time这个对象的引用地址赋值给setInterval方法的第一个参数。 函数后面的圆括号()实际上是调用(执行)函数的运算符。 如果函数名后面加上圆括号就表示立即调用(执行)这个函数里面的代码。 如: setInterval(time(),10); 表示立即调用(执行)time函数,并将函数执行后的return返回值(没有return会返回undefined)赋值给setInterval方法的第一个参数。
bringtree 2016-11-25
  • 打赏
  • 举报
回复
引用 2 楼 jslang 的回复:
function Satellite(id,speed) {
  this.id = id;
  this.speed = speed;
  this.power = 100;
  this.state = "stop";
  var _this = this;
  setInterval(function () {
    if(_this.state == "run" && _this.power >0 ){_this.power -= 1;}
    else if(_this.state == "stop" && _this.power<100 ){_this.power += 1;}
    else {_this.state = "stop";}
    console.log(_this);
  },1000);

}

大佬 ,我原来的写法是错在哪里了 万一以后需要传参数的话 怎么办?
Go 旅城通票 2016-11-25
  • 打赏
  • 举报
回复
    function Satellite(id, speed) {
        this.id = id;
        this.speed = speed;
        this.power = 100;
        this.state = "stop";
        setInterval((function (_this) {
            return function () {////////返回setInterval要执行的函数,你不家这句是将执行此函数的返回值作为setInterval要执行的代码,没有返回值当然只执行一次
                if (_this.state == "run" && _this.power > 0) { _this.power -= 1; }
                else if (_this.state == "stop" && _this.power < 100) { _this.power += 1; }
                else { _this.state = "stop"; }
                console.log(_this);
            }
        })(this), 1000);

    }

var test = new Satellite(1,10);
test.state = "run";
天际的海浪 2016-11-24
  • 打赏
  • 举报
回复
function Satellite(id,speed) {
  this.id = id;
  this.speed = speed;
  this.power = 100;
  this.state = "stop";
  var _this = this;
  setInterval(function () {
    if(_this.state == "run" && _this.power >0 ){_this.power -= 1;}
    else if(_this.state == "stop" && _this.power<100 ){_this.power += 1;}
    else {_this.state = "stop";}
    console.log(_this);
  },1000);

}

bringtree 2016-11-24
  • 打赏
  • 举报
回复
task10.js:40 Satellite {id: 1, speed: 10, power: 100, state: "stop"}

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧