我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文介绍另外一个相对很常见的函数调用的写法:.apply(),这个.apply()和上一篇文章里面.call()又有什么样的区别呢?又有什么样的使用姿势呢?本文依然非常容易看懂,依然是后续文章的铺垫文章,高手请飘过。

苏南大叔:javascript,如何理解函数原型链上的apply()方法? - js-apply-hero
javascript,如何理解函数原型链上的apply()方法?(图4-1)

大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文描述javascript编程中,.apply()方法的用法。测试环境:node@16.14.2

基本思路

基本上这个.apply().call()是一样的,区别非常不明显。如果已经熟悉了.call()的使用方法的话,.apply().call()的最大区别就是:参数不是单个传递的,而是数组形式打包传递的。

参考代码如下,输出都是3

function test(a, b) {
    return a + b;
}
console.log(test(1, 2));              //3
console.log(test.call("", 1, 2));     //3
console.log(test.apply("", [1, 2]));  //3

函数体需要两个参数ab

  • .call()除了第一个空参数外,后面的就按要求传递ab
  • .apply()除了第一个空参数外,后面的把需要传递ab打包成array传递。

苏南大叔:javascript,如何理解函数原型链上的apply()方法? - apply使用方式
javascript,如何理解函数原型链上的apply()方法?(图4-2)

修改this.指向

.call()一样,.apply()的第一个参数也是修改this指向的。
下面拿一个对象变量做例子,来说明问题。参考代码:

var sunan = {
    c: 3,
    test: function (a, b) {
        return a + b + this.c;
    }
}
console.log(sunan.test(1, 2));                    // 6
console.log(sunan.test.call( { c: 5 },  1, 2 ));  // 8
console.log(sunan.test.apply({ c: 5 }, [1, 2]));  // 8

在这个例子里面,.apply()的第一个参数,传入了一个新的对象,它覆盖了原有的数据。

苏南大叔:javascript,如何理解函数原型链上的apply()方法? - apply-this
javascript,如何理解函数原型链上的apply()方法?(图4-3)

可能的错误

也许会碰到下面的错误提示信息:

TypeError: CreateListFromArrayLike called on non-object

解决方案就是把参数打包成数组[],进行传递。

苏南大叔:javascript,如何理解函数原型链上的apply()方法? - apply-error
javascript,如何理解函数原型链上的apply()方法?(图4-4)

相关链接

总结

函数.apply(),任何函数或方法都可以执行。其第一个参数可以传入一个对象改变函数体里面的this.。如果函数是个不涉及this.的函数。那么,第一个参数就可以随便传递,写啥都可以,不影响逻辑。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   js