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的指向,这对于一些应用当中是十分常用的。
  • 相关阅读:
    LeetCode
    (六)6.5 Neurons Networks Implements of Sparse Autoencoder
    (六)6.4 Neurons Networks Autoencoders and Sparsity
    (六) 6.3 Neurons Networks Gradient Checking
    opencv::调整图像亮度与对比度
    opencv::两张图片的线性融合
    opencv::源码编译
    日志::spdlog
    std::is_same
    json::rapidjson工具
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/7660013.html
Copyright © 2011-2022 走看看