一、函数的不同调用方式决定了this的指向不同,一般指向调用者
1.普通函数   this指向window的调用者
       function fn(){
           console.log('普通函数的this'+this);
       }
       window.fn();
2.对象的方法 this指向的是对象o (object)
       var o={
           sayHi:function(){
               console.log('对象方法this:'+this);
           }
       }
       o.sayHi();
3.构造函数 this指向ldh这个实例
       原型对象里面的this指向的是ldh这个实例对象
        function Star(){}
        Star.prototype.sing=function(){ }
        var ldh=new Star();
4.绑定事件函数this指向的是函数调用者 btn这个按钮对象
        var btn=document.querySelector('button');
        btn.onclick=function(){
            console.log('绑定事件函数的this:'+this);
        }
 5.定时器函数  this 指向的也是window
       window.setTimeout(function(){
           console.log('定时器的this'+this);
       },1000);
6.立即执行函数 this指向window
       (function(){
           console.log('立即执行函数的this'+this);
       })();
二、改变函数内部的this指向
 JavaScript为我们专门提供了一些函数方法帮我们处理函数内部this的指向问题,常用方法有
 bind()、call()、apply()三种方法 ,call()方法调用一个对象,简单理解为调用函数的方式,但是
 它可以改变函数的this指向

fun.call(thisArg,arg1,arg2);
1.call()
       var o={
           name:'any'
       }
       function fn(a,b){
           console.log(this);
           console.log(a+b);
       }
      fn.call(o,1,2);
 //call第一个可以调用函数,第二个可以改变函数内的this指向
 //call的主要作用可以实现继承
 function Father(uname,age,sex){
          this.uname=uname;
          this.age=age;
          this.sex=sex;
      }
      function Son(uname,age,sex){
          Father.call(this,uname,age,sex);
      }
      var son=new Son('刘德华',19,'男');
      console.log(son);
2.apply() 应用
      var o={
          name:'any'
      }
      function fn(arr){
          console.log(this);
          console.log(arr);//'pink'
      }
      fn.apply(o,['pink']);
      //1.也是调用函数 第二个可以改变函数内部的this指向
      //2.但是他的参数必须是数组(伪数组)
      //3.apply的主要应用 比如说我们可以利用apply借助于
      //数学内置对象求最大值
      //Math.max();
      var arr=[1,32,56,88];
    //var max= Math.max.apply(null,arr);
     var max= Math.max.apply(Math,arr);
     var min= Math.min.apply(Math,arr);
     console.log(max,min);
3.bind() 绑定
    <button>点击</button>
    <button>点击</button>
    <button>点击</button>
    var o={
        name:'andy'
    };
    function fn(a,b){
        console.log(this);
        console.log(a+b);
    };
    var f= fn.bind(o,1,2);
       f();
       //1.不会调用原来的函数 可以改变原来函数内部的this指向
       //2.返回的是原函数改变this之后产生的函数
       //3.如果有的函数我们不需要立即调用,但是又想改变这个函数内部
       //的this指向,此时用bind
          var btn =document.querySelector('button');
         btn.onclick=function(){
             this.disabled=true;//this指向的是btn
                //var that=this;
         setTimeout(function(){
        //    that.disabled=false;//定时器函数里面的this指向window
                this.disabled=false;//此时定时器函数里面的this指向的是btn
              }.bind(this),3000)//这个this指向的是btn这个对象
          }   
        
        var btns=document.querySelectorAll('button');
        for(var i=0;i<btns.length;i++){
            btns[i].onclick=function(){
                this.disabled=true;
                setTimeout(function(){
                 this.disabled=false;
                }.bind(this),3000)
            }
        }
 
 
三、call apply bind总结
         相同点:
         都可以改变函数内部的this指向
         区别点:
         1.call和apply会调用函数并且改变函数内部的this指向
        2.call和apply传递的参数不一样,call传递参数aru1、aru2形式
           apply必须数组形式[arg]
        3.bind不会调用函数,可以改变函数内部的this指向。
       主要应用场景:
         1.call经常做继承
         2.apply经常跟数组有关系,比如借助数学对象实现数组最大值和最小值
         3.bind不调用函数,但是还是想改变this指向,比如改变定时器内部的this指向。

函数的不同调用方式决定了this的指向不同的更多相关文章

  1. JS的一些总结(函数声明和函数表达式的区别,函数中的this指向的问题,函数不同的调用方式,函数也是对象,数组中的函数调用)

    一.函数声明和函数表达式的区别: 函数声明放在if——else语句中,在IE8中会出现问题 函数表达式则不会 <script> if(true){ function f1(){ conso ...

  2. JS高级---函数中的this的指向,函数的不同调用方式

    函数中的this的指向 普通函数中的this是谁?-----window 对象.方法中的this是谁?----当前的实例对象 定时器方法中的this是谁?----window 构造函数中的this是谁 ...

  3. js函数的四种调用方式以及对应的this指向

    一.函数调用,此时this是全局的也就是window 1 var c=function(){ 2 alert(this==window) 3 } 4 c()//true 二.方法调用 var myOb ...

  4. 函数四种调用模式以及其中的this指向

    第一种:函数直接执行模式 function add(a,b){ console.log(this); return a+b; } add(10,20)//this===window 第二种:对象方法的 ...

  5. Javascript中函数的四种调用方式

    一.Javascript中函数的几个基本知识点: 1.函数的名字只是一个指向函数的指针,所以即使在不同的执行环境,即不同对象调用这个函数,这个函数指向的仍然是同一个函数. 2.函数中有两个特殊的内部属 ...

  6. javascript 函数的4种调用方式与 this(上下文)的指向

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! javascript中作用域链和this(上下文)的指向是很容易混淆的,简单的说就是: 作用域链取决于函数 ...

  7. JavaScript函数的声明与调用方式

    入职第一天小记 对于初入前端的程序猿来说,对于函数的理解与使用可谓是相当浅薄的,回顾这自己近几年的工作以及学习经历,准备对JavaScript来个系统的总结. 如果要我们对H5中的表单做个简单的校验, ...

  8. 浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序

    在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x);} 函数字面量(Function Li ...

  9. JS调用函数的两种方式

    <script type="text/javascript"> window.onload = init; //onload 表示页面全部加载完毕后,再调用init() ...

随机推荐

  1. 0day学习笔记(3)Windows定位API引起的惨案(原理)

    段选择器FS与TEB WinNT内核下内存采用保护模式,段寄存器的意义与实模式汇编下的意义不同.另外,FS存的是段选择子,而不是实模式下的高16位基地址. FS寄存器指向当前活动线程的TEB结构(线程 ...

  2. DDOS攻击攻击种类和原理

    DoS攻击.DDoS攻击和DRDoS攻击相信大家已经早有耳闻了吧!DoS是Denial of Service的简写,就是拒绝服务,而DDoS就是Distributed Denial of Servic ...

  3. java基础问题 (待解决)

    (1)接口与抽象类的区别? (2)Java中的异常有哪几类?分别怎么使用? (3)常用的集合类有哪些?比如List如何排序? (4)ArrayList和LinkedList内部的实现大致是怎样的?他们 ...

  4. Linux 用户管理和提权

    Linux ⽀持多个⼈使⽤同⼀个⽤户登录系统, Windows 在修改组策略的情况下,也可以多个⼈使⽤同⼀个⽤户登录 远程连接Linux的⽅式:SSH协议 远程连接Windows的⽅式:RDP协议 安 ...

  5. centos 编码问题 编码转换 cd到对应目录 执行 中文解压

    2019独角兽企业重金招聘Python工程师标准>>> **unzip -O CP936 xxx.zip (用GBK, GB18030也可以)** find -type f -nam ...

  6. 移动端上传图片(引入exif-js,图片被压缩为base64)

    <template> <div class="vue-box"> <img :src="imgUrl" alt="&qu ...

  7. Condition的await()和signal()流程

    介绍 Condition是j.u.c包下提供的一个接口. 可以翻译成 条件对象,其作用是线程先等待,当外部满足某一条件时,在通过条件对象唤醒等待的线程.ArrayBlockingQueue就是通过Co ...

  8. 家用PC机打造VSphere5.1 测试环境:之部署VCenter Server 5.1

    家用PC机打造VSphere5.1 测试环境前言:实践出真知,同样学习VMware VSphere 的朋友,也需要不断的测试总结,再测试再总结只有不断的积累才能学好,但是动辄几万的服务器不是所有朋友都 ...

  9. 外媒评Mate 10 Pro:智慧拍照惊人,续航能力卓越

    说到近期的热门机型,华为Mate 10 Pro绝对算是被人们谈论最多的一个,其可以算是首款搭载移动AI芯片的顶级旗舰机型,而且AI技术在这部手机上拥有多项实际的应用,带来的体验非传统智能手机可比. 由 ...

  10. tar命令基本、进阶使用指北

    tar命令基本.进阶使用指北 摘要 打包与压缩是我们在计算机系统日常使用中必备的一个工具,就如我们在使用Windows系统,也需要类似WinRAR的压缩软件来将许多数据.文件打包成一个文件,并压缩其占 ...