js函数中两个比较有趣的方法:apply()和call()

#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

猜你喜欢

转载自blog.csdn.net/weixin_39080782/article/details/78660222