博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数绑定之call()、apply()及bind()
阅读量:5210 次
发布时间:2019-06-14

本文共 1813 字,大约阅读时间需要 6 分钟。

call()和apply()这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this的指向。

首先apply()方法接收两个参数:第一个参数是在其中运行函数的作用域,也就是说第一个参数指出了函数要在哪执行,第二个参数是参数数组或arrgument对象。

1             function sum(num1,num2){ 2                 return num1+num2; 3             } 4             function callSum1(num1,num2){ 5                 return sum.apply(this,arguments); 6             } 7             function callSum2(num1,num2){ 8                 return sum.apply(this,[num1,num2]); 9             }10             alert(callSum1(10,20));11             alert(callSum2(10,20));

上面代码中apply()方法相当于把sum()方法绑定到callSum()中来执行。apply()方法的第二个参数既可以是arguments对象也可以是参数数组。

call()方法与apply()方法的作用相同,区别仅在于接收参数的方式不同,call()方法第一个参数是this值,第二个参数是将原绑定函数的参数逐个列举出来。

1             function sum(num1,num2){2                 return num1+num2;3             }4             function callSum1(num1,num2){5                 return sum.call(this,num1,num2);6             }7             alert(callSum2(10,20));

可以看出,call()和apply()的区别仅在于第二个参数不同。

事实上,call()和apply()的真正强大之处在于能够扩充函数的作用域。

1             window.color='red';2             var o={color:'blue'};3             function sayColor(){4                 alert(this.color);5             }6             sayColor();         //全局环境下执行,this指向window7             sayColor.call(this);       //此处的this说明函数要在全局下执行,因此this指向window8             sayColor.call(window);     //此处call()方法第一个参数表明sayColor()被绑定到全局下9             sayColor.call(o);          //此处call()方法第一个参数表明sayColor()被绑定到o对象下

如果要划分作用域的话,可以划分为:

 

上面说了call()和apply()方法,下面讲讲bind()方法

相同点:三者都是用来改变函数体内this的指向,第一个参数都是this要指向的对象

不同点:bind是返回对应函数,方便后面调用;call、apply则是立即调用

1 var bar=function(){    2   console.log(this.x);    3 } 4 var foo={  5      x:3    6 }    7 bar();   8 bar.bind(foo)(); 9  /*或*/10 var func=bar.bind(foo);   11 func();

结果为undefined,3。

转载于:https://www.cnblogs.com/endlessmy/p/8558484.html

你可能感兴趣的文章
android permission
查看>>
javascript获取textarea中所选文本的开始位置、结束位置和选择的文本
查看>>
【译】在Asp.Net中操作PDF - iTextSharp - 使用字体
查看>>
事务备份还原分离附加
查看>>
JSch - Java实现的SFTP(文件上传详解篇)
查看>>
一些注意点
查看>>
.net 文本框只允许输入XX,(正则表达式)
查看>>
C#修饰符
查看>>
20.核心初始化之异常向量表
查看>>
[BSGS][哈希]luogu P3846 可爱的质数
查看>>
Python 第四十五章 MySQL 内容回顾
查看>>
iostat参数说明
查看>>
js 封装获取元素的第一个元素
查看>>
iOS 获取Home键指纹验证
查看>>
Python-Mac 安装 PyQt4
查看>>
P2571 [SCOI2010]传送带
查看>>
哈希表1
查看>>
用Data Url (data:image/jpg;base64,)将小图片生成数据流形式
查看>>
实验2-2
查看>>
C#初识
查看>>