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的指向,這對於一些應用當中是十分常用的。
 
 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM