记一个有趣的问题

题目的重点应该是原型与定时器,题目如下:

function MyObject(myInfo) {
  this.info = myInfo;
}
MyObject.prototype.sayInfo = function() {
  console.log(this.info);
};
MyObject.prototype.repeatSay = function() {
  setInterval(this.sayInfo, 1000);
};

var cmd = new MyObject('Cmd');
cmd.repeatSay();

问怎样修改才能每秒输出一次’Cmd’
其实乍一看还以为这个程序没有错,但执行后发现每次输出都是undefined
问题的关键就在于setInterval内调用的this还是repeateSay中的this(也就是cmd这个变量)吗?实际上已经被替换成其他东西了(可能是window或者什么其他的吧,总之绝不是cmd这个变量)
知道了问题的根源就有解决方法了,当调用sayInfo的时候把调用对象换回来就好
另外将一个对象赋值给一个变量,此时只是新建了一个指向此对象的指针,也就是C++里面的浅拷贝

// 第一种方法
MyObject.prototype.repeatSay = function(){
    var temp = this; // 用一个临时变量复制此对象的指针
    setInterval(function(){
        temp.sayInfo();
    }, 1000)
}

// 第二种方法
MyObject.prototype.repeatSay = function() {
  setInterval(this.sayInfo.bind(this), 1000); // bind函数替换调用函数的对象
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值