代码示例:闭包的常见使用 call、apply、bind

问题案例

for (var i=0; i<5; i++) {
  setTimeout(function () {
    console.log(i);
  }, 1000)
}

1秒后 输出 5个5

预期1,1秒后 输出 0,1,2,3,4

// 使用let
for (let i=0; i<5; i++) {
  setTimeout(function () {
    console.log(i);
  }, 1000)
}

// 使用setTimout最后一个参数,传到第一个参数的入参里
for (let i=0; i<5; i++) {
  setTimeout(function (j) {
    console.log(j);
  }, 1000, i)
}

// 使用自执行函数包裹着定时器,传i到新的函数里
for (let i=0; i<5; i++) {
  (function (j) {
     setTimeout(function () {
       console.log(j);
     }, 1000)
  })(i)
}

// 每隔1秒输出一个数字
for (let i=0; i<5; i++) {
  (function (j) {
    setTimeout(function () {
      console.log(j);
    }, j*1000)
  })(i)
}

call、apply、bind

有关于this指向的习题

// 实现call
Function.prototype.myCall = function(_this, ..._args){
  _this = _this ? Object(_this) : window;
  _this['_newFunc'] = this;
  _this._newFunc(..._args)
  delete _this._newFunc; //删除fn
}
// 实现apply
Function.prototype.myApply = function(_this, _args){
  _this = _this ? Object(_this) : window;
  _this['_newFunc'] = this;
  _this._newFunc(..._args)
  delete _this._newFunc; //删除fn
}
// 实现bind
Function.prototype.myBind = function(_this, ..._args){
  _this = _this ? Object(_this) : window;
  _this['_newFunc'] = this;
  return function(){
    _this._newFunc(..._args)
  }
}

var obj1 = {
    name: "张三",
    age: 18,
    fn: function (city,love) {
        console.log(this.name,this.age,city,love);
    }
}
var obj2 = {
  name: "李四",
  age: 20
}
obj1.fn.myCall(obj2, '上海', 'lisiniang')
obj1.fn.myApply(obj2, ['上海', 'lisiniang'])
obj1.fn.myBind(obj2, '上海', 'lisiniang')()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值