JS中的apply、call和bind的用法和区别

apply和call两种调用方式中的this指向,表现出来的特征就是:对象可以‘借用’其他对象的方法

obj对象有一个方法fn,obj1想借用obj的方法fn,可以用obj.fn.apply(obj1)

1、apply

在使用apply方式使用一个函数时

  • 第1个参数为thisObject,调用时采用传入的thisObject代替函数体中this的指向
  • 第2个参数传入一个数组,函数会用数组的值取代"参数列表"

如果第一个传入的参数是null,那么,在函数体内的this会指向全局对象,在浏览器中就是window

 

2、call

call方式和apply方式的差别主要体现在传入的形式参数的不一样

当采用call调用的时候

  • 第1个参数传入thisObject
  • 第2个参数以及后面的参数组成'实参列表'传递给函数。

 

3、bind

和call很相似

  • 第一个参数是this的指向
  • 从第二个参数开始是接收的参数列表

区别在于bind方法返回值是函数以及bind接收的参数列表的使用。call 是把第二个及以后的参数作为 fn 方法的实参传进去,而 fn1 方法的实参实则是在 bind 中参数的基础上再往后排。

bind 方法不会立即执行,而是返回一个改变了上下文 this 后的函数。

 

根据代码理解

function fn(name) {
    this.name = name
}

var obj = {}

fn.call(obj) //fn函数中的this指向obj

console.log(fn.call(obj)) //undefined
console.log(obj) // {name: undefined}

console.log(fn.call(obj, 'name')) //undefined
console.log(obj) // {name: name}


console.log(fn.apply(obj, ['name'])) //undefined 注意:apply第二个参数是数组
console.log(obj) // {name: name}

console.log(fn.bind(obj, 'name')) // fn(name){this.name =name} 返回值是一个函数
console.log(obj) // {} 注意bind不会立即执行

console.log(fn.bind(obj, 'name')()) // fn(name){this.name =name} 返回值是一个函数
console.log(obj) // {name: name}

 

 

参考:https://www.cnblogs.com/alai88/p/5518441.html

https://www.jianshu.com/p/bc541afad6ee

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值