最近开发的过程中遇到了this指向问题,首先想到的是call()、apply()、bind()三个方法,有些时候这三个方法确实是十分重要,现在我们就把他们的使用方法及异同点讲解一下。

  1、每个函数都包含三个非继承而来的方法,call()方法、apply()方法和bind()方法

      2、相同点:三者的作用都是一样的,都是在特定作用中调用函数,等于设置函数体内this的值,以扩充函数赖以运行的作用域。

  一般来说,this总是指向调用某个方法的对象,但是使用call()、apply()和bind()方法时,就会改变this的指向。

  3、不同点:

    1)、bind()方法会返回一个函数,将接受多个参数的函数变换成接受一个单一参数。

      注意:bind(thisArg[, arg1[, arg2[, ...]]]), 将接受多个参数的函数变换成接受一个单一参数。bind()方法所返回的函数的length(形参数量)等于原函数的形参数量减去传入bind()方法中的实参数量(第一个参数以后的所有参数),因为传入bind中的实参都

      会绑定到原函数的形参。

    2)、apply()方法 接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。

      注意:apply([thisObj [,argArray] ]);,调用一个对象的一个方法,2另一个对象替换当前对象。如果argArray不是一个有效数组或不是arguments对象,那么将导致一个TypeError,如果没有提供argArray和thisObj任何一个参数,那么Global对象

      将用作thisObj。

    3)、call()方法 第一个参数和apply()方法的一样,但是传递给函数的参数必须列举出来。

      注意:call([thisObject[,arg1 [,arg2 [,...,argn]]]]);,应用某一对象的一个方法,用另一个对象替换当前对象。call方法可以用来代替另一个对象调用一个方法,call方法可以将一个函数的对象上下文从初始的上下文改变为thisObj指定的新对象,如果没有

      提供thisObj参数,那么Global对象被用于thisObj。

   话不多说,上代码:

  

 //例1
<script>
window.color = 'red';
document.color = 'yellow'; var s1 = {color: 'blue' };
function changeColor(){
console.log(this.color);
} changeColor.call(); //red (默认传递参数)
changeColor.call(window); //red
changeColor.call(document); //yellow
changeColor.call(this); //red
changeColor.call(s1); //blue </script> //例2
var Pet = {
words : '...',
speak : function (say) {
console.log(say + ''+ this.words)
}
}
Pet.speak('Speak'); // 结果:Speak... var Dog = {
words:'Wang'
} //将this的指向改变成了Dog
Pet.speak.call(Dog, 'Speak'); //结果: SpeakWang

call的用例代码

 //例1
<script>
window.number = 'one';
document.number = 'two'; var s1 = {number: 'three' };
function changeColor(){
console.log(this.number);
} changeColor.apply(); //one (默认传参)
changeColor.apply(window); //one
changeColor.apply(document); //two
changeColor.apply(this); //one
changeColor.apply(s1); //three </script> //例2
function Pet(words){
this.words = words;
this.speak = function () {
console.log( this.words)
}
}
function Dog(words){
//Pet.call(this, words); //结果: Wang
Pet.apply(this, arguments); //结果: Wang
}
var dog = new Dog('Wang');
dog.speak();

apply的用例代码

 var test = {
a : 5,
b : 6,
sum : function (a,b) {
var self = this;
function getA() {
return self.a;
}
function getB(){
return self.b;
}
alert(a);
alert(b);
return getA() + getB();
}
}
var obj = {a:2,b:3};
alert(test.sum.call(obj,4,5)); // 调用时self = this = obj,alert顺序4,5,5
alert(test.sum.apply(obj,[6,7])); // 调用时self = this = obj,alert顺序6,7,5
var sum = test.sum.bind(obj,8); // 此处返回一个只有一个参数的函数sum(b)
alert(sum(9)); // 调用时self = this = obj,alert顺序8,9,5

bind的用例代码

   

  总结:
    1、call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象
    2、call的参数是直接放进去的,第二第三第n个参数全都用逗号分隔
    3、apply的所有参数都必须放在一个数组里面传进去
    4、bind除了返回是函数以外,它的参数传递方式和call 一样。    
    当然,三者的参数不限定是string类型,允许是各种类型,包括函数 、 object 等等!

最新文章

  1. Lind.DDD.SSO单点登陆组件的使用(原创)
  2. 使用Solr索引MySQL数据
  3. 所有的畅通工程[HDU1232][HDU1874][HDU1875][HDU1879]
  4. HoloLens模拟器仿真器与文档现已向开发者们开放
  5. 获取 Chromium 源代码以及环境配置
  6. 关于android的屏幕保持常亮
  7. Autodesk 2015全套密钥
  8. Microsoft Visual Studio与Firefly 加载的项目已建议,更新源代码地位问题
  9. HDU 2025 查找最大元�
  10. Swift - 在界面上生成81个随机红,灰色圆点(SpriteKit游戏开发)
  11. Disqus – About Disqus
  12. LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新
  13. VR全景智慧城市—城市就在你眼前
  14. 浅谈Javascript中的Label语句
  15. 根据URL地址获取对应的HTML,根据对应的URL下载图片
  16. Faster RCNN 学习与实现
  17. JavaScript中七种数据类型&#183;中&#183;一
  18. java 对视频和图片进行加密解密[转]
  19. 在WPF中使用全局快捷键
  20. Python中函数的参数传递与可变长参数

热门文章

  1. springboot没有webapp目录——手动添加
  2. js修改css属性值
  3. Servlet技术之——概述、实现、细节、获取资源、ServletConfig、ServletContext
  4. Java 文件下载工具类
  5. datanode无法连接到namenode
  6. python学习-24 局部变量与全局变量
  7. 缓冲区Buffer和缓存区Cache的区别
  8. go 函数 命名返回值
  9. SAS学习笔记3 输入输出格式(format、informat函数)
  10. dockerfile相关命令