最近又遇到了JacvaScript中的call()方法和apply()方法,而在某些时候这两个方法还确实是十分重要的,那么就让我总结这两个方法的使用和区别吧。

1.改变函数内部的this指向的三种方法:call(),apply(),bind()

2. 相同点:都可以改变this指向。

都是在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域。
一般来说,this总是指向调用某个方法的对象,但是使用call()和apply()方法时,就会改变this的指向。
call()方法使用示例:
语法: 函数.call(this, arg1, arg2, arg3, arg4)
第一个参数用来指定函数内部的this指向,后面的参数是函数执行时所需的实参。
//例1
  1. <script>
  2. window.color = 'red';
  3. document.color = 'yellow';
  4.  
  5. var s1 = {color: 'blue' };
  6. function changeColor(){
  7. console.log(this.color);
  8. }
  9.  
  10. changeColor.call(); //red (默认传递参数)
  11. changeColor.call(window); //red
  12. changeColor.call(document); //yellow
  13. changeColor.call(this); //red
  14. changeColor.call(s1); //blue
  15.  
  16. </script>
 
//例2
  1. var Pet = {
  2. words : '...',
  3. speak : function (say) {
  4. console.log(say + ''+ this.words)
  5. }
  6. }
  7. Pet.speak('Speak'); // 结果:Speak...
  8.  
  9. var Dog = {
  10. words:'Wang'
  11. }
 
//将this的指向改变成了Dog
  1. Pet.speak.call(Dog, 'Speak'); //结果: SpeakWang
 
apply()方法使用示例:
语法: 函数.apply(this, []);
第一个参数用来指定函数内部的this指向;
第二个参数要求是一个数组或者伪数组,apply会把它平铺然后传入对应的函数中.
可以平铺数据;
//例1
  1. <script>
  2. window.number = 'one';
  3. document.number = 'two';
  4.  
  5. var s1 = {number: 'three' };
  6. function changeColor(){
  7. console.log(this.number);
  8. }
  9.  
  10. changeColor.apply(); //one (默认传参)
  11. changeColor.apply(window); //one
  12. changeColor.apply(document); //two
  13. changeColor.apply(this); //one
  14. changeColor.apply(s1); //three
  15.  
  16. </script>
 
//例2
  1. function Pet(words){
  2. this.words = words;
  3. this.speak = function () {
  4. console.log( this.words)
  5. }
  6. }
  7. function Dog(words){
  8. //Pet.call(this, words); //结果: Wang
  9. Pet.apply(this, arguments); //结果: Wang
  10. }
  11. var dog = new Dog('Wang');
  12. dog.speak();

bind()方法使用示例:

语法: 函数.bind(this);
该方法返回一个函数,是一个新的函数,
 
  1. this.name="jack";
  2. var demo={
  3. name:"rose",
  4. getName:function(){return this.name;}
  5. }
  6.  
  7. console.log(demo.getName());//输出rose 这里的this指向demo
  8.  
  9. var another=demo.getName;
  10. console.log(another())//输出jack 这里的this指向全局对象
  11.  
  12. //运用bind方法更改this指向
  13. var another2=another.bind(demo);
  14. console.log(another2());//输出rose 这里this指向了demo对象了;

3. 不同点:接收参数的方式不同。

apply()方法 接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。
语法:apply([thisObj [,argArray] ]);,调用一个对象的一个方法,2另一个对象替换当前对象。
说明:如果argArray不是一个有效数组或不是arguments对象,那么将导致一个 
TypeError,如果没有提供argArray和thisObj任何一个参数,那么Global对象将用作thisObj。
call()方法 第一个参数和apply()方法的一样,但是传递给函数的参数必须列举出来。
语法:call([thisObject[,arg1 [,arg2 [,...,argn]]]]);,应用某一对象的一个方法,用另一个对象替换当前对象。
说明: call方法可以用来代替另一个对象调用一个方法,call方法可以将一个函数的对象上下文从初始的上下文改变为thisObj指定的新对象,如果没有提供thisObj参数,那么Global对象被用于thisObj。
注:不同之处是call和apply是一次性改变this,bind是永久性改变this,可以认为bind的灵活性更高,你可以先把this绑定好, 然后什么时候想执行就什么时候执行。
使用示例1:
  1. function add(c,d){
  2. return this.a + this.b + c + d;
  3. }
  4. var s = {a:1, b:2};
  5. console.log(add.call(s,3,4)); // 1+2+3+4 = 10
  6. console.log(add.apply(s,[5,6])); // 1+2+5+6 = 14
 
使用示例2:
  1. <script>
  2. window.firstName = "Cynthia";
  3. window.lastName = "_xie";
  4. var myObject = {firstName:'my', lastName:'Object'};
  5. function getName(){
  6. console.log(this.firstName + this.lastName);
  7. }
  8. function getMessage(sex,age){
  9. console.log(this.firstName + this.lastName + " 性别: " + sex + " age: " + age );
  10. }
  11. getName.call(window); // Cynthia_xie
  12. getName.call(myObject); // myObject
  13.  
  14. getName.apply(window); // Cynthia_xie
  15. getName.apply(myObject);// myObject
  16.  
  17. getMessage.call(window,"女",21); //Cynthia_xie 性别: 女 age: 21
  18. getMessage.apply(window,["女",21]); // Cynthia_xie 性别: 女 age: 21
  19.  
  20. getMessage.call(myObject,"未知",22); //myObject 性别: 未知 age: 22
  21. getMessage.apply(myObject,["未知",22]); // myObject 性别: 未知 age: 22
  22.  
  23. </script>

  

 

(三十七)js改变this指向的方法的更多相关文章

  1. 前端js中this指向及改变this指向的方法

    js中this指向是一个难点,花了很长时间来整理和学习相关的知识点. 一. this this是JS中的关键字, 它始终指向了一个对象, this是一个指针; 参考博文: JavaScript函数中的 ...

  2. Javasript中this指向问题和改变this指向的方法

    在学习javascript中我们往往会被this的指向问题弄的头昏转向,今天我们就来学习一下this的指向问题,和改变this指向的方法. 一.this的指向问题 在学习this的指向问题之前我们需要 ...

  3. 【面试题】JS改变this指向的三种方法

    一.this指向 点击打开视频讲解更加详细 this随处可见,一般谁调用,this就指向谁.this在不同环境下,不同作用下,表现的也不同. 以下几种情况,this都是指向window 1.全局作用下 ...

  4. 可以改变this指向的方法

    this一般指向的是当前被调用者,但也可以通过其它方式来改变它的指向,下面将介绍三种方式: 1.call用作继承时: function Parent(age){ this.name=['mike',' ...

  5. this指向及改变this指向的方法

    一.函数的调用方式决定了 this 的指向不同,但总的原则,this指的是调用函数的那个对象: 1.普通函数调用,此时 this 指向 全局对象window function fn() { conso ...

  6. js 改变this指向的三种方法 bind call apply

    先了解下bind call apply 的注意点 bind 需要手动调用 第一个参数 this 要指向的对象,后面是 散列的参数 call 不需要手动调用 第一个参数 this 要指向的对象,后面是 ...

  7. js改变this指向

    js中修改this的指向 方法整理 call,apply,bind 以上的三哥方法都是用来改变js中this的指向 call 使用方法:fun.call(thisArg[,arg1[, arg2[, ...

  8. 改变this指向的三种方法

    call.apply.bind三者为改变this指向的方法. 共同点:第一个参数都为改变this的指针.若第一参数为null/undefined,this默认指向window call(无数个参数) ...

  9. this指向详解及改变它的指向的方法

    一.this指向详解(彻底理解js中this的指向,不必硬背) 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是 ...

随机推荐

  1. Javascript作用域详解。

    javascript的作用域 是按照   函数来划分的. 网址:http://www.cnblogs.com/rubylouvre/archive/2009/08/21/1551270.html

  2. C# Json格式

    using LitJson; //自定义Json类 JsonDataResult jsondata = new JsonDataResult() { Success = false }; HttpCo ...

  3. sql 语句 名称解析,是 由内向外的。

    子查询内  找不到的 字段 会 向外 寻找,还是找不到 就报错:找到了就不报错,但是 子查询语句就毫无意义了: 解决办法:  字段前面要跟上表的名称.  一般 字段无效 立刻 报错.

  4. zoj2432

    /* 首先,dp的最开始是定义状态 dp[i][j] 表示A串的前i个,与B串的前j个,并以B[j]为结尾的LCIS 的长度. 状态转移方程: if(A[i]==B[j]) dp[i][j]=max( ...

  5. jQuery/CSS3 3D焦点图动画

    在线演示 本地下载

  6. 数据结构(二) 树Tree

    五.树 树的定义   树的逻辑表示:树形表示法.文氏图表示法.凹入表示法.括号表示法.         结点:表示树中的元素,包括数据项及若干指向其子树的分支. 结点的度:结点拥有的子树树:树的度:一 ...

  7. redis通过命令批量删除key

    需求:想删除 notify_ 开头的所有key redis-cli KEYS "notify_*" | xargs redis-cli DEL 通过 notify_* 来匹配

  8. Mysql数据库导出sql脚本

    1. 运行环境Centos mysqldump -h localhost -u root -p etv > ./etv.sql etv 是要导出的数据库名 > 设置导出的路径和文件名

  9. SpringBoot2.0整合Sharding-Jdbc

    maven: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spri ...

  10. [POI2009]Lyz

    Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人.xi为负,则代表走了这么多人 ...