#js函数中两个比较有趣的方法:apply和call
apply()和call()这两个方法都是每个函数自带的方法,作用是在特定的作用域中调用这个函数。不明白的同学可以这样理解:
学校要体检,咱们是同学,不巧的是今天我嗓子疼,不能说话。这个时候体检老师问我姓名。。。
// 由于我不能说话,所以没有sayName这个方法
var me = {
name: "王某某"
}
var you = {
name: "李某某",
sayName: function(){
console.log(this.name)
}
}
这个时候怎么办,你肯定得帮我啊
于是乎:
you.sayName();
you.sayName.call(me);
------------>输出:
李某某
王某某
你先是说出了自己的名字,然后替我说出了我的名字
例子可能举得不好,但是同学们应该能明白call能做什么了。
call和apply的作用与结果都是一样的,只不过用法不太一样。
他们的共同作用就是:设置函数体内this对象的值
用法
apply
apply()接受两个参数,第一个是指定函数发生的作用域,第二个参数是可以是数组,也可以是arguments对象。当函数执行时,会将apply()的第二个参数作为函数执行所需要的参数。
function connectStr(){
var ret = '';
// 把传进来的所有字符串连接起来
if(!arguments.length) return ret;
for(let i=0;i<arguments.length;i++){
ret+=arguments[i];
}
return ret;
}
function callConnectFunc(str1,str2){
// 这里的this指的是window(严格模式下会是undefined)
console.log(connectStr.apply(this, [str1,str2]));
// 会发现两种调用它结果是一样的
console.log(connectStr.apply(this, arguments));
}
callConnectFunc('1','2');
------------>输出:
12
12
实用技巧
js中的Math对象有求一组数据中的最大和最小值的方法,min()、max()
参数是任意多个数值,比如:Math.min(1,3,6,2,5),但是我们经常会把这一类数据放在一个数组中,想直接求一个数组中的最大最小值,我们可以这Math.min.apply(Math,arrayValue)
var arrayValue = [1,3,6,2,5]
var max = Math.max.apply(Math,arrayValue)
我们赶紧来看看call是怎么调用的把
call
call()方法的第一个参数与apply相同,都是指调用call或apply的函数的函数体内this对象的值。但是call()方法从第二个参数以后都代表执行函数要传递的参数(就是apply第二个参数,一一罗列出来)
扫描二维码关注公众号,回复:
3371683 查看本文章
function callConnectFunc(str1,str2){
// 这里用call来调用原函数,但是要把所有参数一一列举出来,对于不明确参数个数时不太合适
console.log(connectStr.call(this, str1, str2));
}
callConnectFunc('1','2');
------------>输出:
12