call()和apply()的用法

童靴们好, 今天为大家讲解call()和apply()的用法 。说起call()和apply()的用法 ,很多初级面试题都会问到call()和apply()的区别 。 实际上它们功能是一样的,只不过是传入参数的形式不同 。 今天我们来简单的介绍一下它们的使用

用途

在特定的作用域中调用函数,实际上等于设置函数体内this对象。

apply()

apply()接收两个参数,第一个是在其中运行函数的作用域,另一个参数数组(也可以是arguments)。下面举个栗子感受一下:

如上 ,callCount()在执行count()函数时传入了this作为this值 (因为在全局作用域中调用 ,所以this指向的window)..因为在函数callCount()中调用了函数count() ,返回count()的结果 , 所以在全局下调用callCount()传入参数会结果会返回4 . apply()参数也可以是arguments ,如下:

call()

call()与apply()方法功能是一样的 ,只不过是接收参数的方式不同 。它的第一个参数是运行函数的作用域没有变化 ,不同的是,其余的参数都是直接传递给函数。也就是说 ,传递函数的参数不需要使用数组的形式 ,而是逐个列举出来 ,小编有点懒,直接把上面的例子改一下:

怎么样 , 是不是很简单哦。在使用call()方法的情况下 ,callCount()必须明确的传入每一个参数。结果与使用apply()没有什么不同。至于是用于call()或者apply(), 要取决于你采用哪种给函数传递参数的方式最方便 , 小编认为大部分情况下使用call()的情况比较多 。

实际上 , call()和apply()真正强大的功能在于它可以扩充函数的作用域 , 来看一个新的例子:

如上sayHello()是在全局下面定义并且调用 ,所以this.name指向的就是window.name ,结果输出“洋洋” ,而后面两次使用call传入的参数this和window自然都是指向的window.name , 结果都为“洋洋” 。而最后一次使用call()调用传入的是obj ,所以函数内的this,指向了obj , 也就是说此时输出的是obj.name ,所以结果为“明明” 哦

你必须非常努力 ,才能看起来毫不费力

关注小白前端,持续收到文章推送~

举报
评论 0