首先,这三个方法都是改变函数的this对象的指向来扩展函数赖以运行的作用域。
- 每个函数都包含这三个非继承而来的方法。
- 他们的用途相同,都是在特定的作用域中调用函数。
- 第一个参数都是this要指向的对象。
- 都可以传递参数,传参方式不同。
- apply、call 返回函数运行结果, bind 会生成一个函数
- 传参: 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