JavaScript apply、call和bind 方法的使用

版权声明:可以胡乱转载。 https://blog.csdn.net/hunyxv/article/details/79075319

首先,这三个方法都是改变函数的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

猜你喜欢

转载自blog.csdn.net/hunyxv/article/details/79075319
今日推荐