zoukankan      html  css  js  c++  java
  • js函数的四种调用方式以及对应的this指向

    一、函数调用,此时this是全局的也就是window

    1 var c=function(){
    2    alert(this==window)
    3   }
    4   c()//true

    二、方法调用

    var myObj={
      value:2,
      inc:function(num){
       alert(this.value+num);
      }
     }
     myobject.inc(1); //结果3,因为this指向myObj

    注意:内部匿名函数不属于当前对象的函数,因此this指向了全局对象window

    var myObj={
       name:'myObject',
       value:0,
       increment:function(num){
        this.value += typeof(num) ==='number'? num:0;
       },
       toString:function(){
        return '[object:'+this.name+'{value:'+this.value+'}]';
       },
      
       getInfo:function(){
          return (function(){
            return this.toString();//内部匿名函数不属于当前对象的函数,因此this指向了全局对象window
          })();
      }
     }
    alert(myObj.getInfo());//[object window];
    解决方法:
     var myObj={
      name:'myObject',
      value:0,
      increment:function(num)   {
       this.value += typeof(num) ==='number' ? num : 0;
      },
      toString:function()   {
        return '[object:'+this.name+'{value:'+this.value+'}]';
      },
      getInfo:function(){
       var This=this;//先把当前的this指向存起来
       return (function(){ 
          return This.toString();
       })();
      }
     }
    alert(myObj.getInfo());//[Object:myObject {value:0}]
    三、用new关键字来新建一个函数对象的调用,this指向被绑定到构造函数的实例上
     var fn = function (status){
      this.status = status;
     }
     fn.prototype.get_status = function(){
       return this.status;
     }
     var test = new fn('my status');
     alert(test.get_status);//my status,this指向test
    四、apply/call调用
    function MyObject(name){
       this.name=name ||'MyObject';
       this.value=0;
       this.increment=function(num){
       this.value += typeof(num) === 'number' ? num : 0;
      };
      this.toString=function(){
        return '[Object:'+this.name+' {value:'+this.value+'}]';
      };
       this.target=this;
     }
     function getInfo(){
       return this.toString();
     }
     var myObj=new MyObject();
     alert(getInfo.apply(myObj));//[Object:MyObject {value:0}],this指向myObj
     alert(getInfo.apply(window));//[object Window],this指向window
    通过call和apply可以重新定义函数的执行环境,即this的指向,这对于一些应用当中是十分常用的。
     
    
    
  • 相关阅读:
    Threejs学习 一
    Mapbox的表达式
    mapbox 不加载地图
    SQL Server将查询出数据进行列转行操作
    SQL Server 常用近百条SQL语句(收藏版)
    SQL Server DATEDIFF() 函数用法
    SQL Server 数据库开启日志CDC记录,导致SQL Server 数据库日志异常增大
    查询SQL Server数据库使用的版本号信息
    windows 无法启动 SQL Server (MSSQLSERVER) 服务(位于本地计算机上)。错误 1069由于登入失败而无法启动 。
    SQL Server 不同数据间建立链接服务器进行连接查询
  • 原文地址:https://www.cnblogs.com/souliid/p/6005675.html
Copyright © 2011-2022 走看看