彻底搞懂JavaScript中的apply和call方法(必看)

 更新时间:2017年09月18日 08:39:15   投稿:jingxian  
下面小编就为大家带来一篇彻底搞懂JavaScript中的apply和call方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

call和apply都是为了改变某个函数运行的context上下文而存在的,即为了改变函数体内部this的指向。因为JavaScript的函数存在定义上下文和运行时上下文以及上下文是可以改变的概念。

回到目录定义

fun.apply(thisArg, [argsArray])
fun.call(thisArg, arg1,arg2, ...)

其中thisArg可以为null或undefined,此时表示全局对象,更详细见MDN:apply()、call()

二者的作用完全一样,只是接受参数的方式不太一样。例如,有一个函数定义如下:

var func1 = function(arg1, arg2){};

可以通过func1.call(this, arg1, arg2);或者func1.apply(this, [arg1, arg2])来调用。其中this是你想指定的上下文,它可以是任意一个JavaScript对象(JavaScript一切皆对象),call需要把参数传递进去,而apply则把参数放在数组里。

因为在JavaScript中,某个函数的参数数量是不固定的,当你的参数明确知道数量时,用call,而不确定的时候用apply,然后把参数push进数组传递进去。当参数数量不确定时,函数内部也可以通过arguments这个数组来遍历所有的参数。

回到目录一个例子

在JavaScript OOP中,我们经常会这样定义:

funciton programmer() {
}

programmer.prototype = {
  hobby: 'programming',
  say.function() {
    alert('I love' + this.hobby);
  }
}

var xiaoMing = new programmer();
xiaoMing.say();

此时如果我们有一个设计妹子对象xiaoHua = {hobby: 'designing'};我们不想对它重新定义say方法,那么我们可以通过call或apply使用xiaoMing的say方法:xiaoMing.say.call(xiaoHua)。

由此可看出,call和apply都是为了动态改变this而出现的,当一个object没有某个方法或属性时,但是其他的对象有,则可以借助call或apply来使用其他对象的方法来操作。

obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);

两者都是把obj(即this)绑定到thisObj,这时候thisObj具备(或继承)了obj的属性和方法

其中比较常见的,通过document.getElementByTagName选择的节点是一种类数组,它不能应用Array下的push,pop等方法。但我们可以通过:

var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));

Array.prototype.slice.call能所有具有length属性的对象转为数组,这样domNodes就可以应用Array下的所有方法了。

以上这篇彻底搞懂JavaScript中的apply和call方法(必看)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • uni-app做微信小程序的分包处理方法

    uni-app做微信小程序的分包处理方法

    分包指的是把一个完整的小程序项目,按照不同的需求划分为不同的子包,在构建时打包成不同的分包,用户在浏览时按需加载,这篇文章主要介绍了uni-app做微信小程序的分包处理,需要的朋友可以参考下
    2023-02-02
  • 利用canvas实现的加载动画效果实例代码

    利用canvas实现的加载动画效果实例代码

    之前看到一个Android的加载效果不错,一直想自己动手做一个,正好这段时间重温了一个Canvas,所以就尝试了一下。下面这篇文章主要给大家介绍了关于利用canvas实现加载效果的相关资料,需要的朋友可以参考下。
    2017-07-07
  • npm script和package-lock.json使用示例详解

    npm script和package-lock.json使用示例详解

    这篇文章主要为大家介绍了npm script和package-lock.json使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件

    改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件

    这篇文章主要介绍了改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Web程序员必备的7个JavaScript函数

    Web程序员必备的7个JavaScript函数

    这篇文章主要为大家详细介绍了Web程序员必备的7个JavaScript函数,教会大家如何灵活运用JavaScript函数,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • js综合应用实例简单的表格统计

    js综合应用实例简单的表格统计

    在做调查问卷的过程中,遇到一个表格的统计问题,一个需要用到js方面的综合知识,感觉还不错所以记录下来与大家分享,感兴趣的朋友可以了解下
    2013-09-09
  • 微信小程序 配置顶部导航条标题颜色的实现方法

    微信小程序 配置顶部导航条标题颜色的实现方法

    这篇文章主要介绍了微信小程序 配置顶部导航条标题颜色的实现方法的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • Javascript中异步等待的深入理解

    Javascript中异步等待的深入理解

    Async / Await是人们期待已久的JavaScript功能,它使使用异步功能更加有趣和易于理解。这篇文章主要给大家介绍了关于Javascript中异步等待的相关资料,需要的朋友可以参考下
    2021-05-05
  • mui 打开新窗口的方式总结及注意事项

    mui 打开新窗口的方式总结及注意事项

    这篇文章主要介绍了mui 打开新窗口的方式总结及注意事项,需要的朋友可以参考下
    2017-08-08
  • Layui数据表格跳转到指定页的实现方法

    Layui数据表格跳转到指定页的实现方法

    今天小编就为大家分享一篇Layui数据表格跳转到指定页的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09

最新评论