首页 > 其他分享 >call与apply的第一个参数都为this的指向,call后面的参数为传入的参数列表,apply为参数的数组.

call与apply的第一个参数都为this的指向,call后面的参数为传入的参数列表,apply为参数的数组.

时间:2023-11-10 22:56:42浏览次数:33  
标签:num1 sayColor call apply 参数 函数

【摘自JavaScript高级程序设计】

函数还有两个方法:apply()和call()。这两个方法都会以指定的this值来调用函数,即会设置调用函数时函数体内this对象的值。apply()方法接收两个参数:函数内this的值和一个参数数组。第二个参数可以是Array的实例,但也可以是arguments对象。来看下面的例子:

function sum(num1, num2) {
return num1 + num2;
}

function callSum1(num1, num2) {
return sum.apply(this, arguments); // 传入arguments对象
}

function callSum2(num1, num2) {
return sum.apply(this, [num1, num2]); // 传入数组
}

console.log(callSum1(10, 10)); // 20
console.log(callSum2(10, 10)); // 20
在这个例子中,callSum1()会调用sum()函数,将this作为函数体内的this值(这里等于window,因为是在全局作用域中调用的)传入,同时还传入了arguments对象。callSum2()也会调用sum()函数,但会传入参数的数组。这两个函数都会执行并返回正确的结果。

注意 在严格模式下,调用函数时如果没有指定上下文对象,则this值不会指向window。除非使用apply()或call()把函数指定给一个对象,否则this的值会变成undefined。

call()方法与apply()的作用一样,只是传参的形式不同。第一个参数跟apply()一样,也是this值,而剩下的要传给被调用函数的参数则是逐个传递的。换句话说,通过call()向函数传参时,必须将参数一个一个地列出来,比如:

function sum(num1, num2) {
return num1 + num2;
}

function callSum(num1, num2) {
return sum.call(this, num1, num2);
}

console.log(callSum(10, 10)); // 20
这里的callSum()函数必须逐个地把参数传给call()方法。结果跟apply()的例子一样。到底是使用apply()还是call(),完全取决于怎么给要调用的函数传参更方便。如果想直接传arguments对象或者一个数组,那就用apply();否则,就用call()。当然,如果不用给被调用的函数传参,则使用哪个方法都一样。

apply()和call()真正强大的地方并不是给函数传参,而是控制函数调用上下文即函数体内this值的能力。考虑下面的例子:

window.color = 'red';
let o = {
color: 'blue'
};

function sayColor() {
console.log(this.color);
}

sayColor(); // red

sayColor.call(this); // red
sayColor.call(window); // red
sayColor.call(o); // blue
这个例子是在之前那个关于this对象的例子基础上修改而成的。同样,sayColor()是一个全局函数,如果在全局作用域中调用它,那么会显示"red"。这是因为this.color会求值为window.color。如果在全局作用域中显式调用sayColor.call(this)或者sayColor.call(window),则同样都会显示"red"。而在使用sayColor.call(o)把函数的执行上下文即this切换为对象o之后,结果就变成了显示"blue"了。

使用call()或apply()的好处是可以将任意对象设置为任意函数的作用域,这样对象可以不用关心方法。在前面例子最初的版本中,为切换上下文需要先把sayColor()直接赋值为o的属性,然后再调用。而在这个修改后的版本中,就不需要这一步操作了

标签:num1,sayColor,call,apply,参数,函数
From: https://www.cnblogs.com/longmo666/p/17825259.html

相关文章

  • C#开发一个可被带参数调用并返回数据的控制台应用程序
    1标准输出流控制台程序:namespaceReturnConsoleWrite{classProgram{staticvoidMain(string[]args){//程序功能:将所以应用程序输入参数连成一个字符串string_output=null;for(inti=0;i<args.Le......
  • unshift和push如果传入多个参数都是作为一整块插入
    执行以下程序,输出结果为50,10,20,60,70vardatas=[10,20,30];datas.unshift(40,50);datas.pop();datas.push(60,70);datas.shift();console.log(datas.toString());array.unshift()用于将新元素添加到数组的开头,如果参数有多个,它们作为整体一块插入,所以执行datas.unshi......
  • pycharm右键运行python怎么可以像命令行一样传参数?
    需求:我在命令行敲pythonmain.pyhost.ini执行我在pycharm中如何补充这个host.ini的参数。 AI解决:在PyCharm中右键执行运行时,默认情况下是不会传递参数的,需要手动配置才能将参数传递给脚本。你可以按照以下步骤进行设置:在PyCharm中打开main.py文件。点击顶部工具栏......
  • Vue3 路由查询参数更新后,执行更新方法
    import{ref,defineComponent,watch,getCurrentInstance}from"vue";import{useRoute}from'vue-router';exportdefaultdefineComponent({setup(){consttable=ref({key:'spec_id',......
  • Oracle ODP.NET ConnectionString接池及连接参数
      出自: https://blog.csdn.net/qq_28570965/article/details/126935639 1.连接字符串中提供了服务器地址,端口,实例等信息,具体格式如下:DataSource=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort))(CONNECT_DATA=(SERVICE_NAME=MyDatasource)));UserID=M......
  • c# webapi swagger Area 多级层次分组 添加header参数
    nuget安装Swashbuckle安装完成后会在App_Start中生成SwaggerConfig.cs 项目右键属性生成xml文件 在SwaggerConfig中的Register中进行配置//在内部的GlobalConfiguration.Configuration.EnableSwagger中进行配置c.SingleApiVersion("v1","API");varbaseDiretory=S......
  • DBMS_STATS ORA-20011 Approximate NDV failed ORA-29913 error in executing ODCIEXT
    DBMS_STATSORA-20011ApproximateNDVfailedORA-29913errorinexecutingODCIEXTTABLEOPENcallout目录DBMS_STATSORA-20011ApproximateNDVfailedORA-29913errorinexecutingODCIEXTTABLEOPENcallout1、现象2、分析3、解决1.查看表信息2.确认属于DataPump的表3.删......
  • MTK联发科MT6762/MT6763/MT6765安卓核心板参数规格比较
    MT6762安卓核心板MTK6762安卓核心板是一款工业级高性能、可运行android9.0操作系统的4G智能模块。CPU:4xCortex-A53upto2.0Ghz/4xCortex-A53upto1.5GhzGraphics:IMGGE8320Upto650MhzProcess:12nmMemory:1xLP3933MHz,upto4GB/2xLP4x1600MHz,upto6GB/eMMC5.1Came:21M......
  • 用户信息授权报错“无效的AppID参数”问题排查解决过程
    今天记一个支付宝报错“无效的AppID参数”的问题排查解决过程,希望可以帮到大家。报错产生今天在测试支付宝用户信息授权换取授权访问令牌的时候,遇到了一个报错:“无效的AppID参数”,本来以为是个简单的问题,结果还是花了一点时间去找原因,找到最后发现是自己脑子瓦特了=。=报错......
  • 用户信息授权报错“无效的AppID参数”问题排查解决过程
    今天记一个支付宝报错“无效的AppID参数”的问题排查解决过程,希望可以帮到大家。报错产生今天在测试支付宝用户信息授权换取授权访问令牌的时候,遇到了一个报错:“无效的AppID参数”,本来以为是个简单的问题,结果还是花了一点时间去找原因,找到最后发现是自己脑子瓦特了=。=报错截图如......