Javascript学习---函数内置方法call/apply

Javascript默认为每个函数提供了call()和apply()用来设置函数的上下文对象


call()

call()方法的具体语法内容如下:

func.call(context, arg1, arg2, ...)

其中context是上下文对象;arg1,arg2,...是函数func的参数,以列表的形式接受


这里是一个例子:

function say(phrase) {
  alert(this.name + ': ' + phrase);
}

let user = { name: "John" };
let admin = { name: "Admin" };

// user becomes this, and "Hello" becomes the first argument
say.call( user, "Hello" ); // John: Hello
say.call( admin, "Hello" ); // Admin: Hello

此时因为call()传递给say()的上下文对象为user或者admin,故say()中的this所指向的上下文对象就为user或admin


apply()

apply()的用法和call()很像,具体语法如下:

func.apply(context, args)
与call()不同的是,apply()的第二个参数args接受的是函数参数所组成的数组,看下面例子:
function say(time, phrase) {
  alert(`[${time}] ${this.name}: ${phrase}`);
}

let user = { name: "John" };

let messageData = ['10:00', 'Hello']; // become time and phrase

// user becomes this, messageData is passed as a list of arguments (time, phrase)
say.apply(user, messageData); // [10:00] John: Hello (this=user)

apply()和call()不同的是,call()接受的是函数参数的列表,而apply()接受的是函数参数的数组形式,如下:

let args = [1, 2, 3];

func.call(context, ...args); // pass an array as list with spread operator
func.apply(context, args);   // is same as using apply
上面例子的最终效果是一样的,我们已经知道rest参数的拓展操作可以将数组等可迭代对象转换为列表,故这里使用...args来进行转换args数组


借用别的对象的方法

call()和apply()除了设置上下文对象外,还可以用来调用其他对象的方法,先看下面例子:

function hash() {
  alert( arguments.join() ); // Error: arguments.join is not a function
}

hash(1, 2);

这里arguments.join()报错了,因为arguments参数是函数的默认内置参数,其中包含了函数的所有输入参数,然而它是类数组和可迭代的对象,不是真正的数组对象,故使用jion()这个数组专有的方法就会报错(join()以字符串的形式返回数组的内容)。为了解决这个问题,我们可以使用call()或者apply()来借用数组对象的方法,例如:

function hash() {
  alert( [].join.call(arguments) ); // 1,2
}

hash(1, 2);
这里join()的上下文对象被设置为arguments,join()内部原理是迭代数组对象每一个元素并将元素内容拼接到一个字符串中,再返回,所以[].join.call(arguments)可以正常工作



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值