JavaScript apply、call和bind 方法的使用

首先,这三个方法都是改变函数的this对象的指向来扩展函数赖以运行的作用域。

  1. 每个函数都包含这三个非继承而来的方法。
  2. 他们的用途相同,都是在特定的作用域中调用函数。
  3. 第一个参数都是this要指向的对象。
  4. 都可以传递参数,传参方式不同。
  5. apply、call 返回函数运行结果, bind 会生成一个函数
  6. 传参: apply(Obj, [ 参数1,参数2,… ]), call(Obj, 参数1,参数2,…),bind 在生成的函数执行处传参。
> name = '李明'
'李明'
> age = 18
18
> let People = {name: '小红', age: 17}
undefined
> function sayHello(){
... console.log("Hello! " + this.name);
... }
undefined
> sayHello()
Hello! 李明
undefined
> sayHello.apply(People) // this指向 People对象
Hello! 小红        // 直接返回运行结果
undefined
> sayHello.call(People); // this指向 People对象
Hello! 小红        // 直接返回运行结果
undefined
> sayHello.bind(sayHello)  // 返回一个新函数
[Function: bound sayHello]
> sayHello.bind(People)()  // 可以在(参数)传参
Hello! 小红
undefined
> newSayHello = sayHello.bind(People)
[Function: bound sayHello]
> newSayHello()
Hello! 小红

后来发现一段 Function.prototype.apply.call(fn, obj, args) 代码 ,,这什么鬼……

看完上面知道要绑定一个函数的this对象,可以这样写:fn.apply(obj, args) ,但是如果函数自定义了apply方法,那么要绑定一个函数的this对象只能写成 Function.prototype.apply.call(fn, obj, args)了。 简化方法使用(ES6) :Reflect.apply

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值