Javascript之bind,call,apply方法的使用场景和区别

Javascript之bind,call,apply方法的使用场景和区别

之前的文章里有写到上述三种方法的实现,这次就来对比下这三种方法。

入参 语法 出参
call n个参数,第一个参数为原函数的this指向,其余参数依次传入原函数中进行调用 function.call(thisArg, arg1, arg2, ...) 函数执行结果
apply 最多两个参数,第一个参数为原来函数的this指向,第二个参数是类数组或数组对象,解构后传入原函数进行调用 func.apply(thisArg, [argsArray]) 函数执行结果
bind n个参数,bind中的第一个参数为原来函数的this指向,其余参数依次传入原函数中进行调用 function.bind(thisArg[, arg1[, arg2[, ...]]]) 一个新函数

这三者进行对比一般说的都是call和apply进行对比,bind和call进行对比。具体仔细看看上表写的东西哈。

相同点就是三者都修改了原函数的this指向,为什么这么做呢?按照我的理解来回答就是,共享方法节省内存

大家想一想,假如没有这种修改this指向的办法,而我们又想要打印一些变量的某些属性,是不是就得这么写了:

const teacher = {

name:'三上you亚',

age:'18'

}

function demo(){

console.log(teacher.name)

}

或者这么搞

const teacher = {
name:'三上you亚',
age:'18',
consoleName(){
  console.log(this.name)
}

}
teacher.consoleName()

很麻烦的好不好,而且每个变量我都这么搞是不是占用很多内存

优化一下啦,就成了,那干脆就这么写:

function test(params){
  console.log(params.name)
}
const teacher = {
name:'三上you亚',
age:'18'
}
test(teacher)

ok,这样确实简化了一些,但是我TM每次写一个项目还得创建test这个方法,项目多了这也很烦躁啊。干脆就加到原型上完事了,当然,而且加的话,肯定是加到Function上面啊,总不能加到Object的原型上吧,你能想象会有Object.prototype.['打印一些XX属性']这样的方法吗

喏,这样就好理解了吧。

接下来说一下常见的一个例子:类数组对象使用slice方法

[].slice.call(arguments)

我们都知道啊,类数组对象跟数组不是一回事,只有length属性并且参数的key是从0开始,这两点跟Array一样,其他的方法并不具备,slice方法当然也就没有了。

但在函数中我们拿到arguments后常常需要做一些处理,这时候将他转换成一个数组会更方便一些。

而slice方法的实现则是按照key进行取值的,这个可以用到arguments上,如果我们slice时不填参数则会把arguments里面的value输出到一个数组中去,这样也就实现一个类数组对象转成一个数组对象的目的啦,是不是很奇妙呢

你可能感兴趣的